Cod sursa(job #129368)

Utilizator MarquiseMarquise Marquise Data 29 ianuarie 2008 10:15:29
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <stdio.h>
#define MODULO 663013

long long n, a, b, c, i0, i1, i2, m[4][4], r[4][4], e[4][4];


void inmultire()
{
	int i, j, k;
	for ( i = 1; i <= 3; i++)
	for ( j = 1; j <= 3; j++)
		e[i][j] = 0;

	for ( i = 1; i <= 3; i++)
		for ( j = 1; j <= 3; j++)
			for ( k = 1; k <= 3; k++)
				e[i][j] += r[i][k] * r[k][j];
	for ( i = 1; i <= 3; i++)
	for ( j = 1; j <= 3; j++)
		r[i][j] = e[i][j] % MODULO;
}


void inmultirem()
{  	int i, j, k;
	for ( i = 1; i <= 3; i++)
	for ( j = 1; j <= 3; j++)
		e[i][j] = 0;

	for ( i = 1; i <= 3; i++)
		for ( j = 1; j <= 3; j++)
			for ( k = 1; k <= 3; k++)
				e[i][j] += r[i][k] * m[k][j];
	for ( i = 1; i <= 3; i++)
	for ( j = 1; j <= 3; j++)
		r[i][j] = e[i][j] % MODULO;
}

void putere(int n)
{
	if ( n >=1)
	{
		if ( n % 2 == 0)
		{
			putere(n/2);
			inmultire();
		}
		else
		{
			putere(n-1);
			inmultirem();
		}
	}
}

int main()
{
	long long rasp;
	int t, l, i, j;
	freopen("iepuri.in", "r", stdin);
	freopen("iepuri.out", "w", stdout);
	scanf("%d", &t);
	for ( l = 1; l <= t; l++)
	{
		scanf("%lld %lld %lld %lld %lld %lld %lld", &i0, &i1, &i2, &a, &b, &c, &n);
		m[1][2] = m[2][3] = 1;
		m[1][1] = m[1][3] = m[2][1] = m[2][2] = 0;
		m[3][1] = c; m[3][2] = b; m[3][3] = a;

		for ( i = 1; i <= 3; i++)
			for ( j = i+1; j <= 3; j++)
				r[i][j] = r[j][i] = 0;

		r[1][1] = r[2][2] = r[3][3] = 1;
		putere(n);

		rasp = ( r[1][1] * i0 + r[1][2] * i1 + r[1][3] * i2) %MODULO ;
		printf("%lld\n", rasp);
	}
	return 0;
}