Cod sursa(job #105348)

Utilizator MarquiseMarquise Marquise Data 17 noiembrie 2007 15:54:31
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <stdio.h>
int i0, i1, i2, A, B, C, n, num;
int m1[4][4], m[4][4], mm[4][4];

long p = 666013;
int main()
{
	int i, k, j, jj, r, t, l;
	freopen("iepuri.in", "r", stdin);
	freopen("iepuri.out", "w", stdout);
	scanf("%d", &t);
	for ( l = 1; l <= t; l++)
	{
	scanf("%d %d %d %d %d %d %d", &i0, &i1, &i2, &A, &B, &C, &n);
	m1[1][2] = m[1][2] = m1[2][3] = m[2][3] = 1;
	m1[1][1]=m1[2][1]=m1[2][2]=m1[1][3]=m[1][1]=m[2][1]=m[2][2]=m[1][3] = 0;
	m1[3][1] = m[3][1] = C;
	m1[3][2] = m[3][2] = B;
	m1[3][3] = m[3][3] = A;
	i = 1;
	while ( 2*i <= n)
	{
		for ( j = 1; j <=3; j++)
			for ( k = 1; k <= 3; k++)
				mm[j][k] = ( ((m[j][1]%p) * (m[1][k]%p))%p%p + ((m[j][2]%p) * (m[2][k]%p))%p%p + ((m[j][3]%p) * (m[3][k]%p))%p%p)%p;

		i = 2*i;
		for ( j = 1; j <=3; j++)
			for ( k = 1; k <=3; k++)
				m[j][k] = mm[j][k];
	}
	for ( j = i; j < n; j++)
	{
		for ( jj = 1; jj <=3; jj++)
			for ( k = 1; k <= 3; k++)
				mm[jj][k] = ( ((m[jj][1]%p) * (m1[1][k]%p))%p%p + ((m[jj][2]%p) * (m1[2][k]%p))%p%p + ((m[jj][3]%p) * (m1[3][k]%p))%p%p)%p;

		for ( jj = 1; jj <=3; jj++)
			for ( k = 1; k <=3; k++)
				m[jj][k] = mm[jj][k];
	}
	r = ( ((m[1][1]%p) * (i0%p))%p%p + ((m[1][2]%p) * (i1%p))%p%p + ((m[1][3]%p) * (i2%p))%p%p)%p;
	printf("%d\n", r);
	}
	return 0;
}