Pagini recente » Diferente pentru problema/trmax intre reviziile 11 si 10 | Diferente pentru problema/brperm intre reviziile 10 si 9 | Cod sursa (job #921873) | Cod sursa (job #772757) | Cod sursa (job #3327519)
#include <iostream>
#include <fstream>
#define MOD 666013
using namespace std;
ifstream fin("iepuri.in");
ofstream fout("iepuri.out");
long long task, a, b, c, x, y, z, n, rez[3][3];
void inmultire(long long a[3][3], long long b[3][3], long long rez[3][3])
{
long long temp[3][3];
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
{
temp[i][j] = 0;
for (int k = 0; k < 3; k++)
temp[i][j] = (temp[i][j] + (a[i][k] * b[k][j]) % MOD) % MOD;
}
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
rez[i][j] = temp[i][j];
}
void putere(long long trans[3][3], long long p, long long rez[3][3])
{
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
rez[i][j] = (i == j);
long long base[3][3];
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
base[i][j] = trans[i][j];
while (p)
{
if (p % 2 == 1)
inmultire(rez, base, rez);
inmultire(base, base, base);
p /= 2;
}
}
int main()
{
fin >> task;
while (task--)
{
fin >> x >> y >> z >> a >> b >> c >> n;
if (n == 0)
fout << x % MOD << '\n';
else if (n == 1)
fout << y % MOD << '\n';
else if (n == 2)
fout << z % MOD << '\n';
else
{
long long trans[3][3];
trans[0][0] = 0;
trans[0][1] = 0;
trans[0][2] = c % MOD;
trans[1][0] = 1;
trans[1][1] = 0;
trans[1][2] = b % MOD;
trans[2][0] = 0;
trans[2][1] = 1;
trans[2][2] = a % MOD;
putere(trans, n - 2, rez);
long long answer = 0;
answer = (answer + (rez[0][2] * (x % MOD)) % MOD) % MOD;
answer = (answer + (rez[1][2] * (y % MOD)) % MOD) % MOD;
answer = (answer + (rez[2][2] * (z % MOD)) % MOD) % MOD;
fout << answer << '\n';
}
}
return 0;
}
/*
* x = z0
* y = z1
* z = z2
* z(n) = a*z(n - 1) + b*z(n - 2) + c*z(n - 3)
* z(n) = (x, y, z) * T^(n - 2)
* T = (0 1 0)
* (0 0 1)
* (c b a)
*/