Cod sursa(job #1485588)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 12 septembrie 2015 15:16:21
Problema Iepuri Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <stdio.h>
#define R 666013
#define ll long long

int t, test;
ll m[4][4], r[4][4];

void inmultire(ll a[][4], ll b[][4]);
void putmat(ll m[][4], ll rez[][4], int n);

int main(){
	freopen("iepuri.in", "r", stdin);
	freopen("iepuri.out", "w", stdout);
	scanf("%d", &t);
	for(test = 0; test < t; test++){
		int x, y, z, a, b, c, n, i, j;
		scanf("%d%d%d%d%d%d%d", &x, &y, &z, &a, &b, &c, &n);
		for(i = 0; i < 3; i++)
			for(j = 0; j < 3; j++)
				r[i][j] = (i == j ? 1 : 0);
		m[0][0] = 0 , m[0][1] = 1, m[0][2] = 0;
		m[1][0] = m[1][1] = 0, m[1][2] = 1;
		m[2][0] = c, m[2][1] = b, m[2][2] = a;
		putmat(m, r, n - 2);
		printf("%lld\n", (r[2][0] * x + r[2][1] * y + r[2][2] * z) % R);
	}
	return 0;
}

void inmultire(ll a[][4], ll b[][4]){
	ll c[4][4];
	int i, j;
	for(i = 0; i < 3; i++)
		for(j = 0; j < 3; j++)
			c[i][j] = (a[i][0] * b[0][j] + a[i][1] * b[1][j] + a[i][2] * b[2][j]) % R;
	for(i = 0; i < 3; i++)
		for(j = 0; j < 3; j++)
			a[i][j] = c[i][j];
}

void putmat(ll m[][4], ll rez[][4], int n){
	while(n > 0){
		if(n & 1)
			inmultire(rez, m);
		n >>= 1;
		inmultire(m, m);
	}
}