Cod sursa(job #767885)

Utilizator cahemanCasian Patrascanu caheman Data 15 iulie 2012 12:10:28
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include<stdio.h>
#include<string.h>
long long mat[4][4],curent[4][4],sol[4][4];
inline void initializare(int A,int B,int C)
{
	mat[1][1]=A;
	mat[1][2]=B; 
	mat[1][3]=C;
	mat[2][1]=1;
	mat[2][2]=0; 
	mat[2][3]=0;
	mat[3][1]=0;
	mat[3][2]=1;
	mat[3][3]=0;
} 
void inmultire(long long A[][4],long long B[][4])
{
	int i,j,k; 
	memset(sol,0,sizeof(sol));
	for(i=1;i<=3;i++)
		for(j=1;j<=3;j++)
			for(k=1;k<=3;k++)
				sol[i][j]=(sol[i][j]+A[i][k]*B[k][j])%666013;
	memcpy(curent,sol,sizeof(curent));
}
void ridputlog(int pow)
{
	if(pow==1)
	{
		memcpy(curent,mat,sizeof(curent));
		return ;
	}
	ridputlog(pow>>1);
	if(pow&1)
	{
		inmultire(curent,curent);
		inmultire(curent,mat);
	}
	else
		inmultire(curent,curent);
}
int main()
{
	int T,x,y,z,A,B,C,N,i;
	freopen("iepuri.in","r",stdin);
	freopen("iepuri.out","w",stdout); 
	scanf("%d",&T);
	for(i=1;i<=T;i++)
	{
		scanf("%d%d%d%d%d%d%d",&x,&y,&z,&A,&B,&C,&N);
		initializare(A,B,C);
		ridputlog(N-2);
		printf("%lld\n",((long long)curent[1][1]*z+curent[1][2]*y+curent[1][3]*x)%666013);
	}
	return 0;
}