Cod sursa(job #580164)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 12 aprilie 2011 19:44:08
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include<stdio.h>
#include<string>

#define MOD 666013

FILE*f=fopen("iepuri.in","r");
FILE*g=fopen("iepuri.out","w");

long long unsigned T,ii,a,b,c,V[4],n,P[4][4],S[4][4],C[4][4],i,j,k,Rez;

void inmultire ( long long unsigned A[4][4] , long long unsigned B[4][4] ){
	
	memset(C,0,sizeof(C));
	
	for ( i = 1 ; i <= 3 ; ++i ){
		for ( j = 1 ; j <= 3 ; ++j ){
			for ( k = 1 ; k <= 3 ; ++k ){
				C[i][j] = (C[i][j] + 1LL * A[i][k] * B[k][j] ) % MOD;
			}
		}
	}
	
	memcpy(A,C,sizeof(C));
	
}

inline long long unsigned solve ( long long unsigned n ){
	
	memset(P,0,sizeof(P));
	
	P[1][1] = a; P[2][1] = b; P[3][1] = c; P[1][2] = P[2][3] = 1;   
	
	long long unsigned p = n - 2,Nr = 0;
	
	while ( p ){
		if ( p & 1 ){
			if ( !Nr ){
				memcpy(S,P,sizeof(P));
				++Nr;
			}
			else{
				inmultire(S,P);
			}
		}
		
		inmultire(P,P);
		
		p = p >> 1;
	}
	
	for ( Rez = 0 , i = 1 ; i <= 3 ; ++i ){
		Rez = (Rez + V[i] * S[i][1]) % MOD;
	}
	
	return Rez;
	
}

int main () {
	
	fscanf(f,"%d",&T);
	
	for ( ii = 1 ; ii <= T ; ++ii ){
		fscanf(f,"%d %d %d %d %d %d %d",&V[3],&V[2],&V[1],&a,&b,&c,&n);
		fprintf(g,"%lld\n",solve(n));
	}
	
	fclose(f);
	fclose(g);
	
	return 0;
}