Pagini recente » Cod sursa (job #1894135) | Cod sursa (job #944251) | Cod sursa (job #354082) | Cod sursa (job #1534126) | Cod sursa (job #1205166)
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int MOD = 666013;
class Matrix {
public:
Matrix(const int N = 0):
A{0}
{
if (N == 1)
for (int i = 0; i < 3; i++)
A[i][i] = 1;
}
int* operator[](const int i) {
return A[i];
}
Matrix& operator*=(Matrix B)
{
int C[3][3];
memcpy(C, A, sizeof(C));
memset(A, 0, sizeof(A));
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
for (int k = 0; k < 3; k++)
A[i][j] = (A[i][j] + 1LL * C[i][k] * B[k][j]) % MOD;
return *this;
}
private:
int A[3][3];
};
Matrix Pow(Matrix x, int y)
{
Matrix ret = 1;
for (; y; y >>= 1)
{
if (y & 1) ret *= x;
x *= x;
}
return ret;
}
int main()
{
freopen("iepuri.in", "r", stdin);
freopen("iepuri.out", "w", stdout);
int T;
scanf("%d", &T);
while (T--)
{
int X, Y, Z, A, B, C, N;
scanf("%d%d%d%d%d%d%d", &X, &Y, &Z, &A, &B, &C, &N);
if (N == 0) printf("%d\n", X);
else if (N == 1) printf("%d\n", Y);
else if (N == 2) printf("%d\n", Z);
else
{
Matrix Mat;
Mat[0][0] = A;
Mat[0][1] = B;
Mat[0][2] = C;
Mat[1][0] = Mat[2][1] = 1;
Mat = Pow(Mat, N - 2);
printf("%d\n", int((1LL * Z * Mat[0][0] + 1LL * Y * Mat[0][1] + 1LL * X * Mat[0][2]) % MOD));
}
}
}