Cod sursa(job #398515)

Utilizator sory1806Sandu Sorina-Gabriela sory1806 Data 18 februarie 2010 21:38:36
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include<stdio.h>
#define mod 666013
long long m[3][3], m1[3][3], sol[3][3], v[3], x, y, z, a, b, c, n;

void atrib(long long a[3][3], long long b[3][3])
{	long long i, j;
	for(i=0; i<3; i++)
		for(j=0; j<3; j++)
			a[i][j]=b[i][j];
}

void inm(long long a[3][3], long long b[3][3], long long c[3][3])
{	long long i, j, k;
	for(i=0; i<3; i++)
		for(j=0; j<3; j++)
		{	c[i][j]=0;
			for(k=0; k<3; k++)
				c[i][j]=(((a[i][k]*b[k][j])%mod)+c[i][j])%mod;
		}
}

void lgput (long long m[3][3], long long p)
{	long long temp[3][3], i, j;

	for(i=0; i<3; i++) for(j=0; j<3; j++) if(i==j) sol[i][j]=1; else sol[i][j]=0;
	
	for(i=0; ((1ll<<i)<=p); i++)
	{	if(((1ll<<i)&p)>0)
		{	inm(sol, m, temp);
			atrib(sol, temp);
		}
		inm(m, m, temp);
		atrib(m, temp);
	}
	
}

void solve()
{	long long rez=0;
	lgput(m, n-2);
	atrib(m, sol);
	rez=((m[0][0]*v[0])%mod +
		 (m[0][1]*v[1])%mod +
		 (m[0][2]*v[2])%mod
		) %mod;
	
	printf("%lld\n", rez);
}

int main()
{	long long t, i;
	freopen("iepuri.in", "r", stdin);
	freopen("iepuri.out", "w", stdout);
	scanf("%lld", &t);
	
	for(i=0; i<t; i++)	
	{	scanf("%lld%lld%lld%lld%lld%lld%lld", &x, &y, &z, &a, &b, &c, &n);
		m[0][0]=a; m[0][1]=b; m[0][2]=c;
		m[1][0]=1; m[1][1]=0; m[1][2]=0;
		m[2][0]=0; m[2][1]=1; m[2][2]=0;
		v[0]=z; v[1]=y; v[2]=x;
		solve();
	}
	return 0;
	
}