Cod sursa(job #14225)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 8 februarie 2007 15:03:48
Problema Iepuri Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include<stdio.h>
#define fin  "iepuri.in"
#define fout "iepuri.out"
#define Mod 666013
int n,t;
int templ[4][4]={ 0 , 0 , 0 , 0 ,
		  0 , 0 , 1 , 0 ,
		  0 , 0 , 0 , 1 ,
		  0 , 0 , 0 , 0 };
FILE *in,*out;

void init(long long mat[][4],int a,int b,int c) {
int i,j;
	for (i=1;i<4;++i)
	for (j=1;j<4;++j) mat[i][j]=templ[i][j];

	mat[3][1]=c; mat[3][2]=b; mat[3][3]=a;
}

void unit(long long mat[][4]) {
int i,j;
	for (i=1;i<4;++i)
	for (j=1;j<4;++j) 
		if (i==j) 
			mat[i][j]=1;
		else 
			mat[i][j]=0;
}

void mult(long long a[][4],long long b[][4]) {
int i,j;
long long c[4][4];
	for (i=1;i<4;++i)
	for (j=1;j<4;++j) {
		c[i][j]=(a[i][1]*b[1][j])%Mod;
		c[i][j]=(c[i][j] + (a[i][2]*b[2][j])%Mod)%Mod;
	        c[i][j]=(c[i][j] + (a[i][3]*b[3][j])%Mod)%Mod; 
	}
	for (i=1;i<4;++i)
	for (j=1;j<4;++j) 
		a[i][j]=c[i][j]; 

}

int main() {
int i,j,x,y,z,a,b,c;
long long sol,ans[4][4],m[4][4];
	
	in=fopen(fin,"r"); out=fopen(fout,"w");

	fscanf(in,"%i",&t);

	for (i=1;i<=t;++i) {

		fscanf(in,"%i%i%i",&x,&y,&z);
		fscanf(in,"%i%i%i%i",&a,&b,&c,&n);
		
		init(m,a,b,c);

		if (n&1) 
			init(ans,a,b,c);
		else
		       	unit(ans);

		for (j=2;j<=n;j=j<<1) {
			mult(m,m);

			if (n&j) 
				mult(ans,m);
		}

		//for (int ii=1;ii<4;++ii) {
	//		for (j=1;j<4;++j) printf("%i ",ans[ii][j]);
	//		printf("\n");
	//	}

		sol=(ans[1][1]*x)%Mod;
		sol=(sol+(ans[1][2]*y)%Mod)%Mod;
		sol=(sol+(ans[1][3]*z)%Mod)%Mod;

		fprintf(out,"%lld\n",sol);
	}

	fclose(in); fclose(out);

	return 0;
}