Cod sursa(job #875481)

Utilizator iuli1505Parasca Iuliana iuli1505 Data 10 februarie 2013 11:18:30
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include<cstdio>
#define mod 666013
long long t, v[3][3],a[3][3],n,x,y,z;
void mult(long long X[3][3], long long Y[3][3])
{
    int i,j,aux[3][3];
    for(i=0;i<=2;i++)
        for(j=0;j<=2;j++)
            aux[i][j]=X[i][j];
    aux[0][0]=((X[0][0]*Y[0][0])%mod+(X[0][1]*Y[1][0])%mod+(X[0][2]*Y[2][0])%mod)%mod;
    aux[0][1]=((X[0][0]*Y[0][1])%mod+(X[0][1]*Y[1][1])%mod+(X[0][2]*Y[2][1])%mod)%mod;
    aux[0][2]=((X[0][0]*Y[0][2])%mod+(X[0][1]*Y[1][2])%mod+(X[0][2]*Y[2][2])%mod)%mod;
    aux[1][0]=((X[1][0]*Y[0][0])%mod+(X[1][1]*Y[1][0])%mod+(X[1][2]*Y[2][0])%mod)%mod;
    aux[1][1]=((X[1][0]*Y[0][1])%mod+(X[1][1]*Y[1][1])%mod+(X[1][2]*Y[2][1])%mod)%mod;
    aux[1][2]=((X[1][0]*Y[0][2])%mod+(X[1][1]*Y[1][2])%mod+(X[1][2]*Y[2][2])%mod)%mod;
    aux[2][0]=((X[2][0]*Y[0][0])%mod+(X[2][1]*Y[1][0])%mod+(X[2][2]*Y[2][0])%mod)%mod;
    aux[2][1]=((X[2][0]*Y[0][1])%mod+(X[2][1]*Y[1][1])%mod+(X[2][2]*Y[2][1])%mod)%mod;
    aux[2][2]=((X[2][0]*Y[0][2])%mod+(X[2][1]*Y[1][2])%mod+(X[2][2]*Y[2][2])%mod)%mod;
    X[0][0]=aux[0][0];X[0][1]=aux[0][1];X[0][2]=aux[0][2];
    X[1][0]=aux[1][0];X[1][1]=aux[1][1];X[1][2]=aux[1][2];
    X[2][0]=aux[2][0];X[2][1]=aux[2][1];X[2][2]=aux[2][2];


}
int main()
{
    freopen("iepuri.in","r",stdin);
    freopen("iepuri.out","w",stdout);
    scanf("%d ", &t);
    for(;t;--t)
    {
        scanf("%lld%lld%lld%lld%lld%lld%lld", &x, &y, &z, &v[0][0], &v[0][1], &v[0][2], &n);
        v[1][0]=a[1][0]=1;v[1][1]=a[1][1]=0;v[1][2]=a[1][2]=0;
        v[2][0]=a[2][0]=0;v[2][1]=a[2][1]=1;v[2][2]=a[2][2]=0;
        a[0][0]=v[0][0];a[0][1]=v[0][1];a[0][2]=v[0][2];

        n-=3;
        for(;n!=0;)
        {
            if(n%2)
                mult(a,v);
            mult(v,v);
            n/=2;
        }
        printf("%lld\n", ((a[0][0]*z)%mod+(a[0][1]*y)%mod+(a[0][2]*x)%mod)%mod);
    }
    return 0;
}