Cod sursa(job #326731)

Utilizator cotofanaCotofana Cristian cotofana Data 25 iunie 2009 22:03:00
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <stdio.h>
#define mod 666013

long long x, y, z, a[4][4], n, sol[4][4], tmp[4][4], t;

void attrib(long long dest[4][4], long long src[4][4]) {
	long long i, j;
	for (i=1; i<4; ++i)
		for (j=1; j<4; ++j)
			dest[i][j]=src[i][j];
}

void mul1(long long dest[4][4], long long src1[4][4], long long src2[4][4]) {
	long long i, j, k;
	for (i=1; i<4; ++i)
		for (j=1; j<4; ++j) {
			dest[i][j]=0;
			for (k=1; k<4; ++k) dest[i][j]+=(src1[i][k]*src2[k][j])%mod;
			dest[i][j]%=mod;
		}
}

int main() {
	long long i;
	freopen("iepuri.in", "r", stdin);
	freopen("iepuri.out", "w", stdout);
	scanf("%d\n", &t);
	for (; t; --t) {
		scanf("%lld %lld %lld %lld %lld %lld\n", &x, &y, &z, &a[3][3], &a[3][2], &a[3][1], &n);
		a[1][2]=a[2][3]=1;
		a[1][1]=a[1][3]=a[2][1]=a[2][2]=0;
		sol[3][3]=sol[1][1]=sol[2][2]=1;
		sol[1][2]=sol[1][3]=sol[2][1]=sol[2][3]=sol[3][1]=sol[3][2]=0;
		for (i=1; i<=n; i<<=1) {
			if (i&n) {
				mul1(tmp, a, sol);
				attrib(sol, tmp);
			}
			mul1(tmp, a, a);
			attrib(a, tmp);
		}
		printf("%lld\n", ((sol[1][3]*z)%mod+(sol[1][2]*y)%mod+(sol[1][1]*x)%mod)%mod);
	}
	return 0;
}