Cod sursa(job #228217)

Utilizator andreea_mandreea martinovici andreea_m Data 6 decembrie 2008 19:11:19
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include<stdio.h>
#define NR 666013

long long mat[3][3],rez[3][3];

void init(int a,int b,int c)
{
	mat[0][0]=mat[0][2]=mat[1][0]=mat[1][1]=0;
	mat[0][1]=mat[1][2]=1;
	mat[2][0]=c;
	mat[2][1]=b;
	mat[2][2]=a;
}

void init_r()
{
	for(int i=0;i<3;++i)
		for(int j=0;j<3;++j)
			rez[i][j]=0;
	rez[0][0]=rez[1][1]=rez[2][2]=1;
}

void produs(long long a[3][3],long long b[3][3])
{
	long long aux[3][3]={0};
	for(int i=0;i<3;++i)
		for(int j=0;j<3;++j)
			for(int k=0;k<3;++k)
				aux[i][j]+=a[i][k]*b[k][j]%NR;
	for(int i=0;i<3;++i)
		for(int j=0;j<3;++j)
			a[i][j]=aux[i][j]%NR;
}

void putere(long long a[3][3],long long rez[3][3],int n)
{
	if(n==0)
		return;
	if(n&1)
		produs(rez,a);
	produs(a,a);
	putere(a,rez,n>>1);
}

inline int calcul(int x,int y,int z)
{
	return rez[2][0] * x % NR + rez[2][1] * y % NR + rez[2][2] * z % NR;
}

int main()
{
	freopen("iepuri.in","r",stdin);
	freopen("iepuri.out","w",stdout);
	int T; // numarul de teste
	int a,b,c,x,y,z,n; 
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d%d%d%d%d%d", &x, &y, &z, &a, &b, &c, &n);
		//apelarea unui subprogram
		init(a,b,c);
		init_r();
		putere(mat,rez,n-2);
		printf("%d\n",calcul(x,y,z)%NR);
	}
	return 0;
}