Cod sursa(job #274140)

Utilizator runnaway90Oprescu Radu Constantin runnaway90 Data 9 martie 2009 14:33:50
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include<stdio.h>
#define Q 666013

long long x,y,z,a,b,c,n,t,C[5][5],s[5][5],m[5][5];

void citire(){scanf("%lld %lld %lld %lld %lld %lld %lld",&x,&y,&z,&a,&b,&c,&n);}

inline void mul1(){
long long  i,j,k;
     for (i=1;i<=3;i++)
         for (j=1;j<=3;j++){
             C[i][j]=0;
             for (k=1,C[i];k<=3;k++)
                 C[i][j]+=s[i][k]*m[k][j];
             }
     for (i=1;i<=3;i++)
         for (j=1;j<=3;j++)
             s[i][j]=C[i][j]%Q;
}

inline void mul2(){
long long  i,j,k;
     for (i=1;i<=3;i++)
         for (j=1;j<=3;j++){
             C[i][j]=0;
             for (k=1,C[i];k<=3;k++)
                 C[i][j]+=m[i][k]*m[k][j];
             }
     for (i=1;i<=3;i++)
         for (j=1;j<=3;j++)
             m[i][j]=C[i][j]%Q;
}


void init(){
         s[1][1]=1; s[1][2]=0; s[1][3]=0;
         s[2][1]=0; s[2][2]=1; s[2][3]=0;
         s[3][1]=0; s[3][2]=0; s[3][3]=1;
         m[1][1]=0; m[1][2]=0; m[1][3]=c;
         m[2][1]=1; m[2][2]=0; m[2][3]=b;
         m[3][1]=0; m[3][2]=1; m[3][3]=a;
}

int main(){
long long p;
    freopen("iepuri.in","r",stdin);
    freopen("iepuri.out","w",stdout);
    scanf("%lld",&t);
    for (int crt=1;crt<=t;crt++){
        citire();
        init();
        for (p = 1; p <= n; p <<= 1){
              if (p & n)
                 mul1();
              mul2();
        }
        printf("%lld\n",((s[1][1]*x)%Q+(s[2][1]*y)%Q+(s[3][1]*z)%Q)%Q);
    }
    return 0;
}