Cod sursa(job #414120)

Utilizator nandoLicker Nandor nando Data 9 martie 2010 18:54:34
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <cstdio>

FILE* fin=fopen("iepuri.in","r");
FILE* fout=fopen("iepuri.out","w");

const int mod=666013;

struct mat{
	long long _[3][3];
};

mat mul(mat m1,mat m2){
	mat r;

	r._[0][0]=((m1._[0][0]*m2._[0][0])%mod+(m1._[0][1]*m2._[1][0])%mod+(m1._[0][2]*m2._[2][0])%mod)%mod;
	r._[0][1]=((m1._[0][0]*m2._[0][1])%mod+(m1._[0][1]*m2._[1][1])%mod+(m1._[0][2]*m2._[2][1])%mod)%mod;
	r._[0][2]=((m1._[0][0]*m2._[0][2])%mod+(m1._[0][1]*m2._[1][2])%mod+(m1._[0][2]*m2._[2][2])%mod)%mod;

	r._[1][0]=((m1._[1][0]*m2._[0][0])%mod+(m1._[1][1]*m2._[1][0])%mod+(m1._[1][2]*m2._[2][0])%mod)%mod;
	r._[1][1]=((m1._[1][0]*m2._[0][1])%mod+(m1._[1][1]*m2._[1][1])%mod+(m1._[1][2]*m2._[2][1])%mod)%mod;
	r._[1][2]=((m1._[1][0]*m2._[0][2])%mod+(m1._[1][1]*m2._[1][2])%mod+(m1._[1][2]*m2._[2][2])%mod)%mod;

	r._[2][0]=((m1._[2][0]*m2._[0][0])%mod+(m1._[2][1]*m2._[1][0])%mod+(m1._[2][2]*m2._[2][0])%mod)%mod;
	r._[2][1]=((m1._[2][0]*m2._[0][1])%mod+(m1._[2][1]*m2._[1][1])%mod+(m1._[2][2]*m2._[2][1])%mod)%mod;
	r._[2][2]=((m1._[2][0]*m2._[0][2])%mod+(m1._[2][1]*m2._[1][2])%mod+(m1._[2][2]*m2._[2][2])%mod)%mod;

	return r;
}
mat pow(mat m,int n){
	if(n==1){
		return m;
	}else if(n&1){
		mat t=pow(m,n>>1);
		t=mul(t,t);
		return mul(t,m);
	}else{
		mat t=pow(m,n>>1);
		return mul(t,t);
	}
}

int do_test(long long x,long long y,long long z,long long a,long long b,long long c,long long n){
	mat m;
	m._[0][0]=0,m._[0][1]=1,m._[0][2]=0;
	m._[1][0]=0,m._[1][1]=0,m._[1][2]=1;
	m._[2][0]=c,m._[2][1]=b,m._[2][2]=a;
	m=pow(m,n-2);
	return ((m._[2][0]*x)%mod+(m._[2][1]*y)%mod+(m._[2][2]*z)%mod)%mod;
}
int main(){
	int t;
	long long x,y,z,a,b,c,n;
	fscanf(fin,"%d ",&t);
	for(int i=0;i<t;i++){
		fscanf(fin,"%lld %lld %lld %lld %lld %lld %lld",&x,&y,&z,&a,&b,&c,&n);
		fprintf(fout,"%d\n",do_test(x,y,z,a,b,c,n));
	}
	fclose(fin);
	fclose(fout);
	return 0;
}