Cod sursa(job #504577)

Utilizator crushackPopescu Silviu crushack Data 28 noiembrie 2010 10:03:15
Problema Iepuri Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <stdio.h>
#include <string.h>

const char IN[]="iepuri.in",OUT[]="iepuri.out";
const int mod=  666013;
typedef long long ll;

ll mat[3][3]={ {0,0,1} , {1,0,0} , {0,1,0} };

int T;
int X,Y,Z,A,B,C,N;

void mult(ll a[][3],ll b[][3])
{
	int i,j,k;
	static ll c[3][3];
	memset(c,0,sizeof(c));
	for (i=0;i<3;i++)
		for (j=0;j<3;j++)
			for (k=0;k<3;k++)
				c[i][j]= (c[i][j]+a[i][k]*b[k][j])%mod;
	memcpy(a,c,sizeof(c));
}

void pow(ll a[][3],int p)
{
	int i;
	static ll Sol[3][3];
	memset(Sol,0,sizeof(Sol));
	Sol[0][0]=1;Sol[1][1]=1;Sol[2][2]=1;
	for (i=0;(1<<i)<=p;i++)
	{
		if ( (1<<i)&p)
			mult(Sol,a);
		mult(a,a);
	}
	memcpy(a,Sol,sizeof(Sol));
}

int main()
{
	int i;
	freopen(IN,"r",stdin);
	freopen(OUT,"w",stdout);
	scanf("%d",&T);
	for (i=0;i<T;i++)
	{
		scanf("%d%d%d%d%d%d%d",&X,&Y,&Z,&A,&B,&C,&N);// X Y Z A B C N.
		mat[0][0]= 0 , mat[0][1]=0 , mat[0][2]=C;
		mat[1][0]= 1 , mat[1][1]=0 , mat[1][2]=B;
		mat[2][0]= 0 , mat[2][1]=1 , mat[2][2]=A;
		pow(mat,N-2);
		printf("%d\n", (X*mat[0][2]%mod + Y*mat[1][2]%mod + Z*mat[2][2]%mod )%mod);
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}