Cod sursa(job #577348)

Utilizator petroMilut Petronela petro Data 10 aprilie 2011 02:41:50
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include<stdio.h>
FILE *f=fopen("iepuri.in","r");
FILE *g=fopen("iepuri.out","w");
#define mod 666013
using namespace std;
 
long T, X, Y, Z, A, B, C, N; 
long s;
long AA[4][4], AN[4][4], I[4], aux[4][4];
 
void m(long A1[4][4], long A2[4][4])
{
	int i,j,k;
	for(i=1; i<=3; i++)
		for(j=1; j<=3; j++)
		{
			s = 0;
			for(k=1; k<=3; k++)
				s += (A1[i][k]*A2[k][j])%mod, s %= mod;
			aux[i][j] = s;
		}
	for(i=1; i<=3; i++)
		for(j=1; j<=3; j++)
			A1[i][j] = aux[i][j];
}
 
void putere(int n)
{
	if( n<=1 ) return;
	putere( n/2 );
	m(AN, AN);
	if( n&1 ) m(AN, AA);
}
 
void solve()
{
	int i,j,k;
	AA[2][1] = 1; AA[3][2] = 1;
	fscanf(f,"%ld",&T);
	for(k=1;k<=T;++k)
	{
		fscanf(f,"%ld%ld%ld%ld%ld%ld%ld",&X,&Y,&Z,&A,&B,&C,&N);
		AA[1][1] = A; 
		AA[1][2] = B;
		AA[1][3] = C;
		I[3] = X; 
		I[2] = Y;
		I[1] = Z;
 
		for(i=1; i<=3; i++)
			for(j=1; j<=3; j++)
				AN[i][j] = AA[i][j];
 
		N=N-2;
		putere(N);
 
		s = 0;	
		for(i=1; i<=3; i++) 
			s += ( AN[1][i]*I[i] ) % mod , s %= mod;
		fprintf(g,"%ld\n",s);
	}
}
 
int main()
{
	solve();
	fclose(f);
	fclose(g);
	return 0;
}