Cod sursa(job #485438)

Utilizator deiosxHalalai Tudor Andrei deiosx Data 18 septembrie 2010 12:38:26
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <cstdio>
#define M 666013
long long  m1[4][4],m2[4][4];

int main()

{long long  j,q,i,t,n,x,y,s,z,a,b,c;

 freopen("iepuri.in","r",stdin);
 freopen("iepuri.out","w",stdout);
 scanf("%lld",&t);
 for (;t>0;--t)
 {
	 long long  m3[4][4];
	 scanf("%lld %lld %lld %lld %lld %lld %lld",&x,&y,&z,&a,&b,&c,&n);
	 n-=2;
	 m1[1][1]=m1[1][2]=m1[2][2]=m1[3][1]=0;
	 m1[2][1]=m1[3][2]=1;
	 m1[1][3]=c;
	 m1[2][3]=b;
	 m1[3][3]=a;
	 m2[1][1]=-1;
	 while (n)
	 {
		 if (n%2==1)
		 {
			 if (m2[1][1]<0)
				 {for (i=1;i<=3;++i)
					 for (j=1;j<=3;++j) m2[i][j]=m1[i][j];} else
					 {
						 for (i=1;i<=3;++i) 
							 for (s=0,j=1;j<=3;++j)
							 {
								 for (s=0,q=1;q<=3;++q)
									 s=(s+m2[i][q]*m1[q][j]) % M ;
								 m3[i][j]=s;
							 }
						 for (i=1;i<=3;++i)
							 for (j=1;j<=3;++j) m2[i][j]=m3[i][j];	 
							 
					 }
									 
		 } 
		 
		 
		 for (i=1;i<=3;++i) 
							 for (s=0,j=1;j<=3;++j)
							 {
								 for (s=0,q=1;q<=3;++q)
									 s=(s+m1[i][q]*m1[q][j]) % M ;
								 m3[i][j]=s;
							 }
						 for (i=1;i<=3;++i)
							 for (j=1;j<=3;++j) m1[i][j]=m3[i][j];	 
		 
		 
		 
		 n/=2;
		 
		 
		 
		 
	 }
printf("%lld\n",(m2[1][3]*x+m2[2][3]*y+m2[3][3]*z) % M);	 
 }
 return 0;}