Cod sursa(job #235385)

Utilizator hasegandaniHasegan Daniel hasegandani Data 23 decembrie 2008 17:13:47
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include<stdio.h>

#define mod 666013
int M[3][3],X[3][3];

void bin(int [3][3],int [3][3]);

int main()
{
    int a,b,c,x,y,z,n,t;
    freopen("iepuri.in","r",stdin);
    freopen("iepuri.out","w",stdout);
    scanf("%d",&t);
    for(int i=0;i<t;++i)
        {
            scanf("%d%d%d%d%d%d%d",&x,&y,&z,&a,&b,&c,&n);
            M[0][0]=a; M[0][1]=b; M[0][2]=c;
            M[1][0]=1; M[1][1]=0; M[1][2]=0;
            M[2][0]=0; M[2][1]=1; M[2][2]=0;
            
            X[0][0]=1; X[0][1]=0; X[0][2]=0;
            X[1][0]=0; X[1][1]=1; X[1][2]=0;
            X[2][0]=0; X[2][1]=0; X[2][2]=1;
            while (n)
                {
                if (n%2==1)
                    bin(X,M);
                bin(M,M);
                n/=2;
                }
            printf("%d\n",((X[2][0]*z)%mod + (X[2][1]*y)%mod +(X[2][2]*x)%mod)%mod );
        }
    return 0;
}

void bin(int A[3][3],int B[3][3])
{
    int C[3][3];
    for(int i=0;i<3;++i)
        for(int j=0;j<3;++j)
            {
                C[i][j]=(A[i][0]*B[0][j])%mod;
                C[i][j]=(C[i][j]+   (A[i][1]*B[1][j]) %mod) %mod;
                C[i][j]=(C[i][j]+   (A[i][2]*B[2][j]) %mod) %mod;
            }
            
    A[0][0]=C[0][0];
    A[0][1]=C[0][1];
    A[0][2]=C[0][2];

    A[1][0]=C[1][0];
    A[1][1]=C[1][1];
    A[1][2]=C[1][2];
    
    A[2][0]=C[2][0];
    A[2][1]=C[2][1];
    A[2][2]=C[2][2];
}