Cod sursa(job #470310)

Utilizator ionutz32Ilie Ionut ionutz32 Data 13 iulie 2010 00:50:36
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <cstdio>

int t,x,y,z,a,b,c,n,q[3][3],rez[3][3],p,out[3][3],i,j,k,sol;

void prod(int in1[][3],int in2[][3])
{
    for (i=0;i<3;++i)
        for (j=0;j<3;++j)
            for (k=0;k<3;++k)
                out[i][j]=(out[i][j]+1LL*in1[i][k]*in2[k][j])%666013;
}

int main()
{
    freopen("iepuri.in","r",stdin);
    freopen("iepuri.out","w",stdout);
    scanf("%d",&t);
    while (t--)
    {
        scanf("%d %d %d %d %d %d %d",&x,&y,&z,&a,&b,&c,&n);
        rez[0][0]=rez[1][1]=rez[2][2]=1;
        rez[0][1]=rez[0][2]=rez[1][0]=rez[1][2]=rez[2][0]=rez[2][1]=0;
        q[0][0]=q[0][1]=q[1][1]=q[2][0]=0;
        q[1][0]=q[2][1]=1;
        q[0][2]=c;
        q[1][2]=b;
        q[2][2]=a;
        for (p=n-2;p;p>>=1)
        {
            if (p & 1)
            {
                out[0][0]=out[0][1]=out[0][2]=out[1][0]=out[1][1]=out[1][2]=out[2][0]=out[2][1]=out[2][2]=0;
                prod(rez,q);
                for (i=0;i<3;++i)
                    rez[i][0]=out[i][0],rez[i][1]=out[i][1],rez[i][2]=out[i][2];
            }
            out[0][0]=out[0][1]=out[0][2]=out[1][0]=out[1][1]=out[1][2]=out[2][0]=out[2][1]=out[2][2]=0;
            prod(q,q);
            for (i=0;i<3;++i)
                q[i][0]=out[i][0],q[i][1]=out[i][1],q[i][2]=out[i][2];
        }
        sol=(1LL*x*rez[0][2])%666013;
        sol=(sol+1LL*y*rez[1][2])%666013;
        sol=(sol+1LL*z*rez[2][2])%666013;
        printf("%d\n",sol);
    }
    return 0;
}