Cod sursa(job #819587)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 19 noiembrie 2012 13:04:45
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include<fstream>
#include<string.h>
#define mod 666013
#define dim 3


using namespace std;

ifstream f("iepuri.in");
ofstream g("iepuri.out");

long long unitate[dim][dim];
long long sum , T,X[dim],a,b,c,n;
long long A[dim][dim],temp[dim][dim],sol[dim][dim];
int i;

void multiply(long long Pn[dim][dim],long long P[dim][dim],long long rez[dim][dim]){
	int i,j,k;
	for(i=0;i<3;i++){
		for(j=0;j<3;j++){
			rez[i][j]=0;
			for(k=0;k<3;k++){
				rez[i][j]+=Pn[i][k]*P[k][j]%mod;
				if(rez[i][j]>=mod)
					rez[i][j]-=mod;
			}
		}
	}
}


int main(){
	
	f>>	T;
	unitate[0][0]=unitate[1][1]=unitate[2][2]=1;
	while(T--){
		f>>X[2]>>X[1]>>X[0]>>a>>b>>c>>n;
		
		A[1][1]=A[1][2]=A[2][0]=A[2][2]=0;
		A[1][0]=A[2][1]=1;
		A[0][0]=a;A[0][1]=b;A[0][2]=c;
		
		n-=2;
		
		memcpy(sol,unitate,sizeof(sol));
		
		while(n!=0){
			if(n%2){
				multiply(sol,A,temp);
				memcpy(sol,temp,sizeof(sol));
			}
			multiply(A,A,temp);
			memcpy(A,temp,sizeof(A));
			n/=2;
		}
		sum=0;
		for(i=0;i<3;i++){
			sum+=(sol[0][i]*X[i])%mod;
			sum%=mod;
		}
		g<<sum<<'\n';
	}
	
	
	return 0;
}