Cod sursa(job #213601)

Utilizator madmanjonesJones the one madmanjones Data 10 octombrie 2008 16:17:08
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include<stdio.h>
#define mod 666013

void copie(int dest[3][3],int sursa[3][3]){
	for(int i=0;i<3;++i)
		for(int j=0;j<3;++j)
			dest[i][j]=sursa[i][j];
}

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

inline void init(int a[3][3],int A,int B,int C){
	a[0][0]=a[0][1]=a[1][1]=a[2][0]=0;
	a[1][0]=a[2][1]=1;
	a[0][2]=C;
	a[1][2]=B;
	a[2][2]=A;
}

int calcul(int x,int y,int z,int a,int b,int c,int n){
	int mat[3][3],A[3][3]={0},rez;
	A[0][0]=A[1][1]=A[2][2]=1;
	init(mat,a,b,c);
	n-=2;
	for(; n ; n>>=1){
		if(n&1)
			produs(A,mat);
		produs(mat,mat);
	}
	rez=(int)(((long long)x*(long long)A[0][2])%mod);
	rez+=(int)(((long long)y*(long long)A[1][2])%mod);
	rez+=(int)(((long long)z*(long long)A[2][2])%mod);
	return rez%mod;
}

int main(){
	freopen("iepuri.in","r",stdin);
	freopen("iepuri.out","w",stdout);
	int t,x,y,z,a,b,c,n;
	scanf("%d",&t);
	while(t--){
		scanf("%d%d%d%d%d%d%d",&x,&y,&z,&a,&b,&c,&n);
		printf("%d\n",calcul(x,y,z,a,b,c,n));
	}
	return 0;
}