Cod sursa(job #40586)

Utilizator megabyteBarsan Paul megabyte Data 27 martie 2007 15:34:24
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <cstdio>
#define INF "iepuri.in"
#define OUF "iepuri.out"
#define MAX 4
#define LLI long long int
#define CLB 666013
void mcopy(LLI dest[][MAX],LLI src[][MAX])
{
   register int i,j;
   for(i=1;i<MAX;i++)
	   for(j=1;j<MAX;j++) dest[i][j]=src[i][j];
}
void boria(LLI b[][MAX],LLI a[][MAX],LLI rez[][MAX])
{
	register int i,j,k;
	for(i=1;i<MAX;i++)
		for(j=1;j<MAX;j++)
		{
			rez[i][j]=0;
			for(k=1;k<MAX;k++) rez[i][j]=(rez[i][j]+b[i][k]*a[k][j])%CLB;
		}
}
void mprint(LLI a[][MAX])
{
	register int i,j;
	for(i=1;i<MAX;i++)
	{
		for(j=1;j<MAX;j++) printf("%lld ",a[i][j]);
		printf("\n");
	}
	printf("\n");
}
int main()
{
   FILE *in,*out;
   in=fopen(INF,"r");
   out=fopen(OUF,"w");
   int i,t,j,k;
   LLI x,y,z,a,b,c,n,aux,m1[MAX][MAX]={0},m2[MAX][MAX],m3[MAX][MAX],sol[MAX]={0};
   m1[1][2]=1;m1[2][3]=1;
   LLI maux[MAX][MAX];

   fscanf(in,"%d",&t);
   for(i=1;i<=t;i++)
   {
	   fscanf(in,"%lld %lld %lld %lld %lld %lld %lld",&x,&y,&z,&a,&b,&c,&n);
	   m1[3][1]=c;m1[3][2]=b;m1[3][3]=a;
	   sol[1]=x;sol[2]=y;sol[3]=z;

	   aux=n+1;
	   if(aux<4) fprintf(out,"%lld\n",sol[aux]%CLB);
	   else
	   {
	//	   mprint(m1);
		   for(j=0;j<MAX;j++)
		      for(k=0;k<MAX;k++)
		              if(j==k) m3[j][k]=1;
		   		else m3[j][k]=0;		   
		   aux-=3;
//		   printf("AUX: %lld\n",aux);
		   mcopy(m2,m1);
		   while(aux)
		   {
			   if(aux%2)
			   {
				   boria(m3,m2,maux);
				   mcopy(m3,maux);
			   }
			   aux/=2;
			   boria(m2,m2,maux);
			   mcopy(m2,maux);

		   }
		   //mprint(m2);
	//	   mprint(m3);
                   maux[1][1]=maux[1][2]=maux[1][3]=0;
		   for(j=1;j<MAX;j++)
			   for(k=1;k<MAX;k++) maux[1][j]=(maux[1][j]+m3[j][k]*sol[k])%CLB;
		   fprintf(out,"%lld\n",maux[1][3]);
	   }
   }
   fclose(in);fclose(out);
   return 0;
}