Pagini recente » Cod sursa (job #40823) | Cod sursa (job #2693058) | Cod sursa (job #2395980) | Cod sursa (job #677852) | Cod sursa (job #2750574)
#include "bits/stdc++.h"
#include <cassert>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
using pi = pair<int, int>;
using pll = pair<ll, ll>;
using pd = pair<double, double>;
using pld = pair<ld, ld>;
const int M = 666013;
int main()
{
ifstream cin("iepuri.in");
ofstream cout("iepuri.out");
int T;
cin >> T;
auto mod = [](const ll a) -> ll
{
return a % M;
};
auto matrix_mult = [&](const vector<vector<ll>> &mat1, const vector<vector<ll>> &mat2) -> vector<vector<ll>>
{
const int nr_lines1 = mat1.size(), nr_cols1 = mat1.front().size(),
nr_lines2 = mat2.size(), nr_cols2 = mat2.front().size();
vector<vector<ll>> res_mat(nr_lines1, vector<ll>(nr_cols2));
for (int i = 0; i < nr_lines1; ++i)
{
for (int j = 0; j < nr_cols2; ++j)
{
for (int k = 0; k < nr_cols1; ++k)
{
res_mat[i][j] = mod(res_mat[i][j] + mod(mat1[i][k] * mat2[k][j]));
}
}
}
return res_mat;
};
auto fast_exp = [&](vector<vector<ll>> mat, int exp) -> vector<vector<ll>>
{
const int res_nr_lines = mat.size(), res_nr_cols = mat.front().size();
/* assert(res_nr_lines == res_nr_cols); */
vector<vector<ll>> res(res_nr_lines, vector<ll>(res_nr_cols));
for (int i = 0; i < res_nr_lines; ++i)
{
res[i][i] = 1;
}
while (exp)
{
if (exp & 1)
{
res = move(matrix_mult(res, mat));
}
mat = move(matrix_mult(mat, mat));
exp >>= 1;
}
return res;
};
while (T--)
{
static int X, Y, Z, A, B, C, N;
cin >> X >> Y >> Z >> A >> B >> C >> N;
vector<vector<ll>> rec_mat{{A, B, C},
{1, 0, 0},
{0, 1, 0}};
rec_mat = move(fast_exp(rec_mat, N - 2));
vector<vector<ll>> res_mat{{Z}, {Y}, {X}};
res_mat = move(matrix_mult(rec_mat, res_mat));
cout << res_mat.front().front() << "\n";
}
}