Pagini recente » Cod sursa (job #2307618) | Cod sursa (job #555077) | Cod sursa (job #2688340) | Cod sursa (job #639385) | Cod sursa (job #2676627)
#include <fstream>
#include <cstring>
using namespace std;
const int MODULO = 666013;
int matConst[3][3];
int matPut[3][3];
ifstream in("iepuri.in");
ofstream out("iepuri.out");
// NxM MxK NxK
void inmultire(int a[3][3], int b[3][3], int c[3][3])
{
for (int k = 0; k < 3; k++)
{
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
c[i][j] = (c[i][j] + (long long)a[i][k] * b[k][j]) % MODULO ;
}
}
}
}
void ridicareLog(int n)
{
int base[3][3];
int aux[3][3];
memcpy(base, matConst, sizeof(base));
memset(matPut, 0, sizeof(matPut));
matPut[0][0] = 1;
matPut[1][1] = 1;
matPut[2][2] = 1;
while (n > 0)
{
if (n & 1)
{
memset(aux, 0, sizeof(aux));
inmultire(matPut, base, aux);
memcpy(matPut, aux, sizeof(matPut));
}
memset(aux, 0, sizeof(aux));
inmultire(base, base, aux);
memcpy(base, aux, sizeof(base));
n = n / 2;
}
}
int main()
{
int t;
int x, y, z, a, b, c, n;
in >> t;
for (int i = 1; i <= t; i++)
{
in >> x >> y >> z >> a >> b >> c >> n;
memset(matConst, 0, sizeof(matConst));
matConst[1][0] = 1;
matConst[2][1] = 1;
matConst[0][2] = c;
matConst[1][2] = b;
matConst[2][2] = a;
/*
matConst = {
{0, 0, c},
{1, 0, b},
{0, 1, a}
};
*/
ridicareLog(n - 2);
out << ((long long)x * matPut[0][2] + (long long)y * matPut[1][2] + (long long)z * matPut[2][2]) % MODULO << '\n';
}
return 0;
}