Cod sursa(job #91504)

Utilizator gigi_becaliGigi Becali gigi_becali Data 12 octombrie 2007 17:52:23
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include<stdio.h>
#include<string.h>
#define mod 666013
#define ul unsigned long long 
#define ui unsigned int
FILE *f=fopen("iepuri.in","r"), *g=fopen("iepuri.out","w");
ul a[32][4][4];
ui A,B,C,X,Y,Z,N,m,i,j;
ul M[4][4],D[4][4],E[4][4],q,T;
bool bin[33];
void matrici(int p)
{
  for(int i=1;i<=3;i++)
    for(int j=1;j<=3;j++)
      {
	a[p][i][j]=0;
	  for(int k=1;k<=3;k++)
	    a[p][i][j]+=(((a[p-1][i][k])*(a[p-1][k][j]))), a[p][i][j]%=mod;
      }
  
}		
void xmatrici(int p)
{
  int i,j;
  for(i=1;i<=3;i++)
    for( j=1;j<=3;j++)
      {
	D[i][j]=0;
	for(int k=1;k<=3;k++)
	  D[i][j]+=(((M[i][k])*(a[p][k][j]))), D[i][j]%=mod;
      }
  for(i=1;i<=3;i++)
    for(j=1;j<=3;j++) M[i][j]=D[i][j];
}
void fmatrici()
{
  for(int i=1;i<=3;i++)
    for(int j=1;j<=1;j++)
      {
	D[i][j]=0;
	for(int k=1;k<=3;k++)
	  D[i][j]+=(((M[i][k])*(E[k][j]))), D[i][j]%=mod;
      }
}
int main()
{
  fscanf(f,"%d", &T);
  for(i=1;i<=T;i++)
    {
      fscanf(f,"%d %d %d %d %d %d %d",&X,&Y,&Z,&A,&B,&C,&N);
      memset(a, 0, sizeof(a));
      memset(M, 0, sizeof(M));
      memset(E, 0, sizeof(E));
      a[0][1][2]=1;
      a[0][2][3]=1;
      a[0][3][1]=C;
      a[0][3][2]=B;
      a[0][3][3]=A;
      m=N;
      q=0;
      while(m)
	{
	  bin[q++]=m%2;
	  m/=2;
	  
	}
    
      M[1][1]=1;
      M[2][2]=1;
      M[3][3]=1;
      for(j=1;j<=q;++j) matrici(j);
     
      for(j=0;j<q;j++) 
	if(bin[j]) xmatrici(j);
      
      E[1][1]=X;
      E[2][1]=Y;
      E[3][1]=Z;
      
        fmatrici();
	//  int sum=0;
	//sum+=D[1][1]*X; sum%=mod;
	//sum+=D[1][2]*Y; sum%=mod;
	//sum+=D[1][3]*Z; sum%=mod;
	//printf("%d\n", sum);
      /*printf("%d\n", D[1][1]);
      
       for(int ii=1;ii<=3;++ii)
	 {
	   for(int jj=1;jj<=3;++jj)printf("%d ", D[ii][jj]);
	   printf("\n");
	 }
       printf("\n");
      */
        fprintf(g,"%d\n",D[1][1]%mod);
    }	
  fclose(g);
  return 0;
}