Cod sursa(job #364513)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 16 noiembrie 2009 00:07:10
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <string.h>
#include <stdio.h>
#define MOD 666013
#define N 32
long long a[N][3][3];

void calc(long long (*t)[3],long long (*m)[3],long long (*n)[3])
{int i,j,k;
 long long temp[3][3];
 memset(temp,0,sizeof(temp));
 for (i=0;i<3;i++)
 {for (j=0;j<3;j++)
  {for (k=0;k<3;k++)
   {temp[i][j]=(temp[i][j]+m[i][k]*n[k][j])%MOD;
   }
  }
 }
 for (i=0;i<3;i++)
 {for (j=0;j<3;j++)
  {t[i][j]=temp[i][j];
  }
 }
}

int main ()
{freopen("iepuri.in","r",stdin);
 freopen("iepuri.out","w",stdout);
 long long A,B,C,x,y,z,n,s;
 int i,j,k,t;
 scanf("%d\n",&t);
 for (i=0;i<t;i++)
 {scanf("%lld %lld %lld %lld %lld %lld %lld",&x,&y,&z,&A,&B,&C,&n);
  memset(a,0,sizeof(a));
  a[1][0][1]=1;
  a[1][1][2]=1;
  a[1][2][0]=C;
  a[1][2][1]=B;
  a[1][2][2]=A;
  
  for (j=2;j<=31;j++)
  {calc(a[j],a[j-1],a[j-1]);
  }
  a[0][0][0]=1;
  a[0][1][1]=1;
  a[0][2][2]=1;
  
  for (j=n,k=1;j;j/=2,k++)
  {if(j%2)
   {calc(a[0],a[0],a[k]);
   }
  }

  s=(a[0][0][0]*x+a[0][0][1]*y+a[0][0][2]*z)%MOD;
  printf("%lld\n",s);
 }
 return 0;
}