Cod sursa(job #394031)

Utilizator dan_10Dan Alexandru dan_10 Data 10 februarie 2010 13:21:50
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include<stdio.h>
using namespace std;

const long m=666013; 

long long v[3][3],h[3][3],o[3][3];

long t,x,y,z,a,b,c,n;

void inmultire()
{
	long i,j,k;
	for(i=0;i<=2;i++)
		for(j=0;j<=2;j++)
			for(k=0;k<=2;k++)
				h[i][j]=(h[i][j]%m+(v[i][k]*v[k][j])%m)%m;
	for(i=0;i<=2;i++)
		for(j=0;j<=2;j++)
		{	v[i][j]=h[i][j];
			h[i][j]=0;
		}
}
void inmultire2()
{
	long i,j,k;
	for(i=0;i<=2;i++)
		for(j=0;j<=2;j++)
			for(k=0;k<=2;k++)
				h[i][j]=(h[i][j]%m+(v[i][k]*v[k][j])%m)%m;
	
	for(i=0;i<=2;i++)
		for(j=0;j<=2;j++)
			for(k=0;k<=2;k++)
				o[i][j]=(o[i][j]%m+(h[i][k]*v[k][j])%m)%m;
	
	for(i=0;i<=2;i++)
		for(j=0;j<=2;j++)
		{	v[i][j]=o[i][j];
			h[i][j]=0;
			o[i][j]=0;
		}
}
void putere(long n) 
{   if(n==1) ; 
	else if(n%2==0)
		{ 	inmultire();
			putere(n/2);
		}
	else 
	{	inmultire2();
		putere(n/2); 
	}
} 

int main()
{
	freopen("iepuri.in","r",stdin);
	freopen("iepuri.out","w",stdout);
	scanf("%ld",&t);
	for(long g=1;g<=t;g++)
	{
	scanf("%ld%ld%ld%ld%ld%ld%ld",&x,&y,&z,&a,&b,&c,&n);
	long i,j;	
	v[2][0]=c;
	v[2][1]=b;
	v[2][2]=a;
	v[0][1]=1;
	v[1][2]=1;
	putere(n);
	long long q=(v[0][0]*x)%m+(v[0][1]*y)%m+(v[0][2]*z)%m;
	printf("%lld\n",q%m);
	q=0;
	for(i=0;i<=2;i++)
	{	for(j=0;j<=2;j++)
		{	//printf("%ld ",v[i][j]);
			v[i][j]=0;
			o[i][j]=0;
			h[i][j]=0;
		}
	//	printf("\n");
	}
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
	
}