Cod sursa(job #2432297)

Utilizator StefanSanStanescu Stefan StefanSan Data 22 iunie 2019 21:55:53
Problema Iepuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <iostream>
#include <algorithm>
#include <cmath>
#include <fstream>

#define ll long long 
#define MOD 666013

using namespace std;

ifstream in("iepuri.in");
ofstream out("iepuri.out");

ll a, b, c, x, y, z, t, n;
ll m[3], Z[3][3];

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

void exponentiere(ll N[3][3], ll p) {
	ll r[3][3] = { {1, 0, 0}, {0, 1, 0}, {0, 0, 1} };
	while (p) {
		if (p % 2 == 1)inmultire(r, N);
		inmultire(N, N);
		p /= 2;
	}
	for (int j = 0; j < 3; j++) {
		for (int i = 0; i < 3; i++) {
			N[i][j] = r[i][j];
		}
	}
}

void inmultire_final(ll a[3], ll b[3][3]) {
	ll c[3];
	c[0] = (1LL * a[0] * b[0][0] + 1LL * a[1] * b[0][1] + 1LL * a[2] * b[0][2]) & MOD;
	c[1] = (1LL * a[0] * b[1][0] + 1LL * a[1] * b[1][1] + 1LL * a[2] * b[1][2]) % MOD;
	c[2] = (1LL * a[0] * b[2][0] + 1LL * a[1] * b[2][1] + 1LL * a[2] * b[2][2]) % MOD;
	for (int j = 0; j < 3; j++) {
		a[j] = c[j];
	}

}

int main() {
	in >> t;
	for (int i = 0; i < t; i++) {
		in >> a >> b >> c >> x >> y >> z >> n;
		m[0] = x, m[1] = y, m[2] = z;
		Z[0][0] = 0, Z[1][0] = 0, Z[2][0] = c;
		Z[0][1] = 1, Z[1][1] = 0, Z[2][1] = b;
		Z[0][2] = 0, Z[1][2] = 1, Z[2][2] = a;
		if (n == 0)out << m[0];
		if (n == 1)out << m[1];
		if (n == 2)out << m[2];
		if (n > 2) {
			exponentiere(Z, n - 2);
			inmultire_final(m, Z);
			out << m[2] % MOD << '\n';
		}
	}
}