Pagini recente » Cod sursa (job #708296) | Cod sursa (job #70440) | Cod sursa (job #577188) | Cod sursa (job #1398415) | Cod sursa (job #2126563)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("iepuri.in");
ofstream fout ("iepuri.out");
const int Mod = 666013;
const short var = 3;
int a[var + 2][var + 2] , v[var + 2][var + 2] , Q , X , Y , Z , A , B , C , nrz;
/**
f[i] = a * f[i - 1] + b * f[i - 2] + c * f[i - 3]
Solutia : exponentiere rapida pe matrice
Complexitate : O(logn)
*/
inline void R(int aux[var + 2][var + 2])
{
for(int i = 1 ; i <= var ; i++)
for(int j = 1 ; j <= var ; j++)
aux[i][j] = 0;
}
inline void COPY(int aux[var + 2][var + 2] , int aux1[var + 2][var + 2])
{
for(int i = 1 ; i <= var ; i++)
for(int j = 1 ; j <= var ; j++)
aux[i][j] = aux1[i][j];
}
inline void Inmult(int aux[var + 2][var + 2] , int aux1[var + 2][var + 2])
{
int c[var + 2][var + 2];
long long s;
for(int i = 1 ; i <= var ; i++)
for(int j = 1 ; j <= var ; j++)
{
s = 0;
for(int k = 0 ; k <= var ; k++)
s += (1LL * aux[i][k] * aux1[k][j]);
c[i][j] = s % Mod;
}
COPY(aux , c);
}
inline void LGPUT(int n)
{
int unit[var + 2][var + 2];
R(unit);
unit[1][1] = unit[2][2] = unit[3][3] = 1; /// matricea unitate -> u * v = v
while(n > 0)
{
if(n % 2 == 1)
Inmult(unit , v);
n /= 2;
Inmult(v , v);
}
COPY(v , unit);
}
inline void Read_Solve()
{
fin >> Q;
while(Q -- )
{
fin >> X >> Y >> Z >> A >> B >> C >> nrz;
R(a);
R(v);
v[2][1] = v[var][2] = 1;
v[1][var] = C;
v[2][var] = B;
v[3][var] = A;
a[1][1] = X;
a[1][2] = Y;
a[1][3] = Z;
LGPUT(nrz - 2);
Inmult(a , v);
fout << a[1][var] << "\n";
}
}
int main()
{
Read_Solve();
fin.close();
fout.close();
return 0;
}