Cod sursa(job #5808)

Utilizator stef2nStefan Istrate stef2n Data 15 ianuarie 2007 09:48:48
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <stdio.h>
#include <string.h>

#define infile "iepuri.in"
#define outfile "iepuri.out"
#define MOD 666013

FILE *fin,*fout;
int X,Y,Z,A,B,C,N;

void rid_put(long long m[3][3], int putere, long long M[3][3])
  {
   if(!putere)
     {
      M[0][0]=1;M[0][1]=0;M[0][2]=0;
      M[1][0]=0;M[1][1]=1;M[1][2]=0;
      M[2][0]=0;M[2][1]=0;M[2][2]=1;
      return;
     }
   rid_put(m,putere/2,M);
   long long P[4][4];
   P[0][0]=M[0][0]*M[0][0]+M[0][1]*M[1][0]+M[0][2]*M[2][0];
   P[0][0]%=MOD;
   P[0][1]=M[0][0]*M[0][1]+M[0][1]*M[1][1]+M[0][2]*M[2][1];
   P[0][1]%=MOD;
   P[0][2]=M[0][0]*M[0][2]+M[0][1]*M[1][2]+M[0][2]*M[2][0];
   P[0][2]%=MOD;
   P[1][0]=M[1][0]*M[0][0]+M[1][1]*M[1][0]+M[1][2]*M[2][0];
   P[1][0]%=MOD;
   P[1][1]=M[1][0]*M[0][1]+M[1][1]*M[1][1]+M[1][2]*M[2][1];
   P[1][1]%=MOD;
   P[1][2]=M[1][0]*M[0][2]+M[1][1]*M[1][2]+M[1][2]*M[2][2];
   P[1][2]%=MOD;
   P[2][0]=M[2][0]*M[0][0]+M[2][1]*M[1][0]+M[2][2]*M[2][0];
   P[2][0]%=MOD;
   P[2][1]=M[2][0]*M[0][1]+M[2][1]*M[1][1]+M[2][2]*M[2][1];
   P[2][1]%=MOD;
   P[2][2]=M[2][0]*M[0][2]+M[2][1]*M[1][2]+M[2][2]*M[2][2];
   P[2][2]%=MOD;
   memcpy(M,P,sizeof(P));
   if(putere%2)
     {
      P[0][0]=C*M[0][2];
      P[0][0]%=MOD;
      P[0][1]=M[0][0]+B*M[0][2];
      P[0][1]%=MOD;
      P[0][2]=M[0][1]+A*M[0][2];
      P[0][2]%=MOD;
      P[1][0]=C*M[1][2];
      P[1][0]%=MOD;
      P[1][1]=M[1][0]+B*M[1][2];
      P[1][1]%=MOD;
      P[1][2]=M[1][1]+A*M[1][2];
      P[1][2]%=MOD;
      P[2][0]=C*M[2][2];
      P[2][0]%=MOD;
      P[2][1]=M[2][0]+B*M[2][2];
      P[2][1]%=MOD;
      P[2][2]=M[2][1]+A*M[2][2];
      P[2][2]%=MOD;
     }
   memcpy(M,P,sizeof(P));
  }


int main()
{
int t,sol;
long long m[3][3],M[3][3];
fin=fopen(infile,"r");
fout=fopen(outfile,"w");
fscanf(fin,"%d",&t);
while(t)
   {
    fscanf(fin,"%d %d %d %d %d %d %d",&X,&Y,&Z,&A,&B,&C,&N);
    m[0][0]=0;m[0][1]=1;m[0][2]=0;
    m[1][0]=0;m[1][1]=0;m[1][2]=1;
    m[2][0]=C;m[2][1]=B;m[2][2]=A;
    rid_put(m,N-2,M);
    sol=M[2][0]*X+M[2][1]*Y+M[2][2]*Z;
    sol%=MOD;
    fprintf(fout,"%d\n",sol);
    t--;
   }
fclose(fin);fclose(fout);
return 0;
}