Pagini recente » Cod sursa (job #449438) | Cod sursa (job #488788) | Cod sursa (job #153538) | Cod sursa (job #1103625) | Cod sursa (job #2184380)
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;
#define MOD 666013
#define KMAX 3
// C = A * B
void multiply_matrix(long A[KMAX][KMAX], long B[KMAX][KMAX], long C[KMAX][KMAX]) {
long tmp[KMAX][KMAX];
for (int i = 0; i < KMAX; ++i) {
for (int j = 0; j < KMAX; ++j) {
unsigned long long sum = 0;
for (int k = 0; k < KMAX; ++k) {
sum += 1LL * A[i][k] * B[k][j];
}
tmp[i][j] = sum % MOD;
}
}
memcpy(C, tmp, sizeof(tmp));
}
// R = C^p
void power_matrix(long C[KMAX][KMAX], int p, long R[KMAX][KMAX]) {
long tmp[KMAX][KMAX];
for (int i = 0; i < KMAX; ++i) {
for (int j = 0; j < KMAX; ++j) {
tmp[i][j] = (i == j) ? 1 : 0;
}
}
while (p != 1) {
if (p % 2 == 0) {
multiply_matrix(C, C, C);
p /= 2;
} else {
multiply_matrix(tmp, C, tmp);
--p;
}
}
multiply_matrix(C, tmp, R);
}
long iepuri(long N, int X, int Y, int Z, int A, int B, int C) {
if (N == 0) return X;
if (N == 1) return Y;
if (N == 2) return Z;
long M[KMAX][KMAX] = { {0, 0, C},
{1, 0, B},
{0, 1, A} };
power_matrix(M, N - 2, M);
long sol = X * M[0][2] + Y * M[1][2] + Z * M[2][2];
return sol % MOD;
}
int main() {
int T, X, Y, Z, A, B, C;
long N;
ifstream f("iepuri.in");
ofstream g("iepuri.out");
f >> T;
for (int i = 0; i < T; ++i) {
f >> X >> Y >> Z >> A >> B >> C >> N;
long long sol = iepuri(N, X, Y, Z, A, B, C);
g << sol << '\n';
}
f.close();
g.close();
return 0;
}