Pagini recente » Istoria paginii runda/going_oni/clasament | Cod sursa (job #1736795) | Cod sursa (job #2000711) | Cod sursa (job #2221256) | Cod sursa (job #1387557)
#include <fstream>
using namespace std;
ifstream in("iepuri.in");
ofstream out("iepuri.out");
#define MOD 666013
int t, x, y, z, a, b, c, n;
int mat[3][3];
void inmultire(int rez[3][3], int a[3][3], int b[3][3])
{
long long aux[3][3];
for(int i = 0; i < 3; i++)
for(int j = 0; j < 3; j++)
{
aux[i][j] = 0;
for(int k = 0; k < 3; k++)
aux[i][j] += (long long)a[i][k] * b[k][j];
aux[i][j] %= MOD;
}
for(int i = 0; i < 3; i++)
for(int j = 0; j < 3; j++)
rez[i][j] = aux[i][j];
}
void putere(int p)
{
if(p == 1)
return;
if(p == 0)
{
for(int i = 0; i < 3; i++)
for(int j = 0; j < 3; j++)
mat[i][j] = ((i ^ j) == 0);
return;
}
if(p % 2)
{
int aux[3][3];
for(int i = 0; i < 3; i++)
for(int j = 0; j < 3; j++)
aux[i][j] = mat[i][j];
inmultire(mat, mat, mat);
putere(p / 2);
inmultire(mat, aux, mat);
return;
}
inmultire(mat, mat, mat);
putere(p / 2);
}
int main()
{
in >> t;
while(t--)
{
in >> x >> y >> z >> a >> b >> c >> n;
if(n == 0)
{
out << x << '\n';
continue;
}
if(n == 1)
{
out << y << '\n';
continue;
}
for(int i = 0; i < 3; i++)
for(int j = 0; j < 3; j++)
mat[i][j] = 0;
mat[0][2] = c;
mat[1][2] = b;
mat[2][2] = a;
mat[1][0] = 1;
mat[2][1] = 1;
putere(n - 2);
long long rez = (long long)x * mat[0][2] + (long long)y * mat[1][2] + (long long)z * mat[2][2];
rez %= MOD;
out << rez << '\n';
}
return 0;
}