Pagini recente » Cod sursa (job #3252605) | Cod sursa (job #1786833) | Cod sursa (job #147009) | Cod sursa (job #157604) | Cod sursa (job #3041873)
#include <bits/stdc++.h>
using namespace std;
#define MOD 666013
ifstream f("iepuri.in");
ofstream g("iepuri.out");
// C = A * B
void multiply_matrix(long long int A[3][3], long long int B[3][3], long long int C[3][3])
{
long long int tmp[3][3];
// tmp = A * B
for (long long int i = 0; i <= 2; i++)
for (long long int j = 0; j <= 2; j++)
{
tmp[i][j] = 0;
for (long long int k = 0; k <= 2; k++)
tmp[i][j] = (tmp[i][j] + (1LL * A[i][k] * B[k][j]) % MOD) % MOD;
}
// C = tmp
memcpy(C, tmp, sizeof(tmp));
}
// R = C^p
void power_matrix(long long int C[3][3], long long int p, long long int R[3][3])
{
// tmp = I (matricea identitate)
long long int tmp[3][3];
for (long long int i = 0; i <= 2; i++)
for (long long int j = 0; j <= 2; j++)
tmp[i][j] = (i == j) ? 1 : 0;
while (p != 1)
if (p % 2 == 0)
{
multiply_matrix(C, C, C); // C = C*C
p = p / 2; // rămâne de calculat C^(p/2)
}
else
{
// reduc la cazul anterior:
multiply_matrix(tmp, C, tmp); // tmp = tmp*C
p--; // rămâne de calculat C^(p-1)
}
// avem o parte din rezultat în C și o parte în tmp
multiply_matrix(C, tmp, R); // rezultat = tmp * C
}
long long int solve_set(long long int x, long long int y, long long int z, long long int a, long long int b, long long int c, long long int n)
{
long long int C[3][3] = { {0, 0, c},
{1, 0, b},
{0, 1, a} };
long long int C2[3][3];
// C2 = C^(n-2)
power_matrix(C, n - 2, C2);
long long int sol = (x * C2[0][2]) % MOD + (y * C2[1][2]) % MOD + (z * C2[2][2]) % MOD;
return sol % MOD;
}
int main()
{
long long int T;
f >> T;
for (long long int i = 1, x, y, z, a, b, c, n;i <= T;i++)
{
f >> x >> y >> z >> a >> b >> c >> n;
g << solve_set(x, y, z, a, b, c, n) << "\n";
}
return 0;
}