Cod sursa(job #474702)

Utilizator CS-meStanca Marian Ciprian CS-me Data 4 august 2010 19:18:48
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include<stdio.h>
#include<string.h>
#define CL(x) memset(x,0,sizeof(x));
#define VMAX 5
#define div 666013
#define NMAX 105
int X,Y,Z,A,B,C,cont,Vec[NMAX];
long long N,Sum,P[VMAX][VMAX],sol[VMAX][VMAX],Mat[VMAX][VMAX],Init[VMAX];
void citire(){
	scanf("%d %d %d %d %d %d", &X,&Y,&Z,&A,&B,&C);
	scanf("%lld",&N);
}
void se(){
	for(cont=-1;N;){
		Vec[++cont]=(N%2==0)?0:1;
		N=(N%2==0)?(N/2):(N-1);
	}
}
void M(int Code){
	int i,j,k;
	if(Code){
    for(i=1;i<VMAX;++i){
		for(j=1;j<VMAX;++j){
			P[i][j]=0;
			for(k=1;k<VMAX;++k)
				P[i][j]+=(sol[i][k]*Mat[k][j])%div,P[i][j]%=div;
		}
	}
	memcpy(sol,P,sizeof(P));
	}
	else{
		for(i=1;i<VMAX;++i){
			for(j=1;j<VMAX;++j){
				P[i][j]=0;
				for(k=1;k<VMAX;++k)
					P[i][j]+=(sol[i][k]*sol[k][j])%div,P[i][j]%=div;
			}
		}
		memcpy(sol,P,sizeof(P));
	}
}
void im(){
	Mat[1][1]=0,Mat[1][2]=1,Mat[1][3]=0;
	Mat[2][1]=0,Mat[2][2]=0,Mat[2][3]=1;
	Mat[3][1]=C,Mat[3][2]=B,Mat[3][3]=A;
	sol[1][1]=1,sol[1][2]=0,sol[1][3]=0;
	sol[2][1]=0,sol[2][2]=1,sol[2][3]=0;
	sol[3][1]=0,sol[3][2]=0,sol[3][3]=1;
	Init[1]=X,Init[2]=Y,Init[3]=Z;
}
void sf(){
	int i;
	im();
	while(cont>=0)
		if(Vec[cont--])
			M(1);
		else
			M(0);
	Sum=0;
	for(i=1;i<VMAX;++i)
		Sum+=(sol[1][i]*Init[i])%div,Sum%=div;
	printf("%lld\n",Sum);
}
int main(){
	int t;
	freopen("iepuri.in","r",stdin);
	freopen("iepuri.out","w",stdout);
	scanf("%d",&t);
	while(t--){
		CL(Vec);
		CL(Mat);
		CL(sol);
		citire();
		se();
		sf();
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}