Pagini recente » Cod sursa (job #102005) | Cod sursa (job #2904749) | Cod sursa (job #1630655) | Cod sursa (job #1777026) | Cod sursa (job #1940693)
#include <iostream>
#include <fstream>
#include <cmath>
#include <iomanip>
#include <algorithm>
using namespace std;
ifstream in("iepuri.in");
ofstream out("iepuri.out");
const int NMax = 5e4 + 5;
typedef long long ll;
const int inf = 1e9;
const int mod = 666013;
// din moment ce avem de calculat un element dintr-un sir cu recurenta
// se poate folosi exponentierea pe matrice pantru a afla rezultatul rapid
ll T,X,Y,Z,A,B,C,N;
void pw(ll[4][4],ll);
void prod(ll[4][4],ll[4][4]);
// prod(m1,m2) face inmultirea dintre matricele patratice de ordin 3 m1 si m2
// si pune rezultatul in matricea m1
// prod(base,exp) calculeaza rezultatul ridicarii la puterea exp a matricei base
// si pune rezultatul in matricea base
int main()
{
in>>T;
while (T--) {
in>>X>>Y>>Z>>A>>B>>C>>N;
ll matrice[4][4];
matrice[1][1] = matrice[1][3] = matrice[2][1] = matrice[2][2] = 0;
matrice[1][2] = matrice[2][3] = 1;
matrice[3][1] = C;
matrice[3][2] = B;
matrice[3][3] = A;
pw(matrice,N);
ll st[4][4];
for (int i=1;i<=3;++i) {
for (int j=1;j<=3;++j) {
st[i][j] = 0;
}
}
st[1][1] = X;
st[2][1] = Y;
st[3][1] = Z;
prod(matrice,st);
out<<matrice[1][1]<<'\n';
}
in.close();out.close();
return 0;
}
void pw(ll base[4][4],ll exp) {
ll res[4][4];
for (int i=1;i<=3;++i) {
for (int j=1;j<=3;++j) {
res[i][j] = 0;
}
res[i][i] = 1;
}
while (exp>0) {
if ((exp & 1) == 1) {
prod(res,base);
}
prod(base,base);
exp >>= 1;
}
for (int i=1;i<=3;++i) {
for (int j=1;j<=3;++j) {
base[i][j] = res[i][j];
}
}
}
void prod(ll a[4][4],ll b[4][4]) {
ll res[4][4];
for (int i=1;i<=3;++i) {
for (int j=1;j<=3;++j) {
res[i][j] = 0;
}
}
for (int i=1;i<=3;++i) {
for (int j=1;j<=3;++j) {
for (int k=1;k<=3;++k) {
res[i][j] = (res[i][j] + a[i][k] * b[k][j]) % mod;
}
}
}
for (int i=1;i<=3;++i) {
for (int j=1;j<=3;++j) {
a[i][j] = res[i][j];
}
}
}