Pagini recente » Cod sursa (job #1279049) | Cod sursa (job #2019390)
#include <cstdio>
using namespace std;
class Matrice{
public:
long long mat[3][3];
Matrice(){
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
mat[i][j] = 0;
}
}
}
void setValues(long long _mat[3][3])
{
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
mat[i][j] = _mat[i][j];
}
}
}
void print(){
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
printf("%lld ", mat[i][j]);
}
printf("\n");
}
}
Matrice operator*(const Matrice& m)
{
Matrice mx;
mx.mat[0][0] = (this->mat[0][0] * m.mat[0][0]) % 666013 + (this->mat[0][1] * m.mat[1][0]) % 666013 + (this->mat[0][2] * m.mat[2][0]) % 666013 ;
mx.mat[0][1] = (this->mat[0][0] * m.mat[0][1]) % 666013 + (this->mat[0][1] * m.mat[1][1]) % 666013 + (this->mat[0][2] * m.mat[2][1]) % 666013 ;
mx.mat[0][2] = (this->mat[0][0] * m.mat[0][2]) % 666013 + (this->mat[0][1] * m.mat[1][2]) % 666013 + (this->mat[0][2] * m.mat[2][2]) % 666013 ;
mx.mat[1][0] = (this->mat[1][0] * m.mat[0][0]) % 666013 + (this->mat[1][1] * m.mat[1][0]) % 666013 + (this->mat[1][2] * m.mat[2][0]) % 666013 ;
mx.mat[1][1] = (this->mat[1][0] * m.mat[0][1]) % 666013 + (this->mat[1][1] * m.mat[1][1]) % 666013 + (this->mat[1][2] * m.mat[2][1]) % 666013 ;
mx.mat[1][2] = (this->mat[1][0] * m.mat[0][2]) % 666013 + (this->mat[1][1] * m.mat[1][2]) % 666013 + (this->mat[1][2] * m.mat[2][2]) % 666013 ;
mx.mat[2][0] = (this->mat[2][0] * m.mat[0][0]) % 666013 + (this->mat[2][1] * m.mat[1][0]) % 666013 + (this->mat[2][2] * m.mat[2][0]) % 666013 ;
mx.mat[2][1] = (this->mat[2][0] * m.mat[0][1]) % 666013 + (this->mat[2][1] * m.mat[1][1]) % 666013 + (this->mat[2][2] * m.mat[2][1]) % 666013 ;
mx.mat[2][2] = (this->mat[2][0] * m.mat[0][2]) % 666013 + (this->mat[2][1] * m.mat[1][2]) % 666013 + (this->mat[2][2] * m.mat[2][2]) % 666013 ;
return mx;
}
};
long long t;
long long n, a, b, c, x, y, z;
void citire()
{
scanf("%lld %lld %lld %lld %lld %lld %lld", &a, &b, &c, &x, &y, &z, &n);
}
Matrice ridicareLaPutere(Matrice &m, long long putere)
{
Matrice tmp;
tmp.mat[0][0] = 1;
tmp.mat[1][1] = 1;
tmp.mat[2][2] = 1;
while(putere > 1)
{
if((putere & 1) != 0)
{
tmp = tmp * m;
m = m * m;
putere /= 2;
}
else{
m = m * m;
putere /= 2;
}
}
return tmp * m;
}
void solve(){
Matrice m1;
m1.mat[0][0] = 0;
m1.mat[0][1] = 0;
m1.mat[0][2] = c;
m1.mat[1][0] = 1;
m1.mat[1][1] = 0;
m1.mat[1][2] = b;
m1.mat[2][0] = 0;
m1.mat[2][1] = 1;
m1.mat[2][2] = a;
m1 = ridicareLaPutere(m1, n - 2);
printf("%lld\n", x * m1.mat[0][2] + y * m1.mat[1][2] + z * m1.mat[2][2]);
}
int main(){
freopen("iepuri.in", "r", stdin);
freopen("iepuri.out", "w", stdout);
scanf("%lld", &t);
for(int k = 0; k < t; k++)
{
citire();
solve();
}
}