Cod sursa(job #394194)

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

const long m=666013; 

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

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

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 putere(long n) 
{   if(n==1) ; 
	else if(n%2==0)
		{ 	inmultire();
			putere(n/2);
		}
	else 
	{	inmultire();
		putere(n/2);
	int 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]*o[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;
		}
	}
} 

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%lld",&x,&y,&z,&a,&b,&c,&n);
	long i,j;	
	o[2][0]=v[2][0]=c;
	o[2][1]=v[2][1]=b;
	o[2][2]=v[2][2]=a;
	o[0][1]=v[0][1]=1;
	o[1][2]=v[1][2]=1;
	
	putere(n);
	long long q=(v[0][0]*x)%m+(v[0][1]*y)%m+(v[0][2]*z)%m;
	q=q%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;
	
}