Cod sursa(job #920609)

Utilizator Bogdan13Bogdan Stoian Bogdan13 Data 20 martie 2013 15:55:52
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include<fstream>
#define R 666013
using namespace std;

ifstream f("iepuri.in");
ofstream g("iepuri.out");

int T, x,y,z,a,b,c,n;
unsigned long long A[4][4],sol[4][4];

void inm(unsigned long long m1[4][4],unsigned long long m2[4][4])
{
    unsigned long long m3[4][4];

    for (int i=1;i<=3;i++)
     for (int j=1;j<=3;j++)
            m3[i][j]=( ( (m1[i][1]*m2[1][j])%R )+( (m1[i][2]*m2[2][j]) % R)+( (m1[i][3]*m2[3][j]) % R ) ) % R;

    for (int i=1;i<=3;i++)
     for (int j=1;j<=3;j++)
        m1[i][j]=m3[i][j];
}

void rid(unsigned long long baz[4][4],int exp)
{
    sol[1][1]=1;sol[2][2]=1;sol[3][3]=1;

    for (int i=0; (1LL<<i)<=exp; i++)
    {
        if ( ( (1<<i) & exp ) > 0 )
        inm(sol,baz);

        inm(baz,baz);

    }


}


int main()
{

    f>>T;

    for (int i=1;i<=T;i++)
    {
        f>>x>>y>>z>>a>>b>>c>>n;

        for (int i=1;i<=3;i++)
        for (int j=1;j<=3;j++)
        {
            A[i][j]=0; sol[i][j]=0;
        }

        A[1][1]=a; A[1][2]=b; A[1][3]=c;
        A[2][1]=1;A[3][2]=1;

        rid(A,n-2);

        g<<( ( (sol[1][1]*z)%R )+( (sol[1][2]*y)%R )+( (sol[1][3]*x)%R ) )%R<<'\n';

    }




return 0;
}