Pagini recente » Cod sursa (job #3194314) | Cod sursa (job #2140540) | Cod sursa (job #371373) | Cod sursa (job #2104460) | Cod sursa (job #3041867)
#include <bits/stdc++.h>
using namespace std;
#define MOD 666013
ifstream f("iepuri.in");
ofstream g("iepuri.out");
// C = A * B
void multiply_matrix(int A[3][3], int B[3][3], int C[3][3])
{
int tmp[3][3];
// tmp = A * B
for (int i = 0; i <= 2; i++)
for (int j = 0; j <= 2; j++)
{
unsigned long long sum = 0; // presupun că suma încape pe 64 de biți
for (int k = 0; k <= 2; k++)
sum += 1LL * A[i][k] * B[k][j];
tmp[i][j] = sum % MOD;
}
// C = tmp
memcpy(C, tmp, sizeof(tmp));
}
// R = C^p
void power_matrix(int C[3][3], int p, int R[3][3])
{
// tmp = I (matricea identitate)
int tmp[3][3];
for (int i = 0; i <= 2; i++)
for (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
}
int solve_set(int x, int y, int z, int a, int b, int c, int n)
{
int C[3][3] = { {0, 0, c},
{1, 0, b},
{0, 1, a} };
// C = C^(n-3)
power_matrix(C, n - 2, C);
long long int sol = (x * C[0][2]) % MOD + (y * C[1][2]) % MOD + (z * C[2][2]) % MOD;
return sol % MOD;
}
int main()
{
int T;
f >> T;
for (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;
}