Cod sursa(job #1214740)

Utilizator azkabancont-vechi azkaban Data 31 iulie 2014 11:56:38
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <cstdio>
#include <cstring>
using namespace std;
const long long mod=666013;

void openIOFiles()
{
 freopen("iepuri.in","r",stdin);
 freopen("iepuri.out","w",stdout);
}

long long Z[5][5],S[5][5],aux[5][5],Sol[5][5];
long long a,b,c,x,y,z,n,i,t,j,exp;

int main(){
openIOFiles();
scanf("%d",&t);
while(t--){
           scanf("%d%d%d%d%d%d%d",&x,&y,&z,&a,&b,&c,&n);
           Z[1][1]=0; Z[1][2]=0; Z[1][3]=c;
           Z[2][1]=1; Z[2][2]=0; Z[2][3]=b;
           Z[3][1]=0; Z[3][2]=1; Z[3][3]=a;

           S[1][1]=x; S[1][2]=y; S[1][3]=z;
 
           for (i=1;i<=3;++i) 
                for (j=1;j<=3;++j) Sol[i][j]=Z[i][j];
      exp=n-3;
      while(exp){
          if (exp%2){ 
                    for (i=1;i<=3;++i)
                       for (j=1;j<=3;++j) aux[i][j]=(Sol[i][1]*Z[1][j]+Sol[i][2]*Z[2][j]+Sol[i][3]*Z[3][j])%mod;
                     for (i=1;i<=3;++i) 
                        for (j=1;j<=3;++j) Sol[i][j]=aux[i][j];
                     --exp;
                    }
              else {
                    for (i=1;i<=3;++i)
                       for (j=1;j<=3;++j) aux[i][j]=(Z[i][1]*Z[1][j]+Z[i][2]*Z[2][j]+Z[i][3]*Z[3][j])%mod;
                    for (i=1;i<=3;++i)
                       for (j=1;j<=3;++j) Z[i][j]=aux[i][j];
                    exp/=2;
                    }
               }
        printf("%lld\n",(S[1][1]*Sol[1][3]+S[1][2]*Sol[2][3]+S[1][3]*Sol[3][3])%mod);
        memset(aux,0,sizeof aux);
}
return 0;
}