Pagini recente » Cod sursa (job #2240390) | Cod sursa (job #2335970) | Cod sursa (job #2210247) | Cod sursa (job #788502) | Cod sursa (job #2495744)
#include <fstream>
#define MOD 666013
using namespace std;
ifstream fin ("iepuri.in");
ofstream fout ("iepuri.out");
struct matrice
{
long long m[3][3];
};
matrice a, b;
int t, X, Y, Z, A, B, C, n;
matrice ridicare_la_putere_matrice ( matrice A, int nr );
matrice inmultire_matrici3 ( matrice A, matrice B );
int main()
{
fin >> t;
for ( ; t-- ; )
{
fin >> X >> Y >> Z >> A >> B >> C >> n;
a.m[0][0] = A, a.m[0][1] = B, a.m[0][2] = C;
a.m[1][0] = 1, a.m[1][1] = 0, a.m[1][2] = 0;
a.m[2][0] = 0, a.m[2][1] = 1, a.m[2][2] = 0;
b.m[0][0] = Z, b.m[0][1] = 0, b.m[0][2] = 0;
b.m[1][0] = Y, b.m[1][1] = 0, b.m[1][2] = 0;
b.m[2][0] = X; b.m[2][1] = 0, b.m[2][2] = 0;
a = ridicare_la_putere_matrice ( a, n - 2 );
b = inmultire_matrici3 ( a, b );
fout << b.m[0][0] << '\n';
}
return 0;
}
matrice ridicare_la_putere_matrice ( matrice A, int nr )
{
if ( nr == 1 ) return A;
else if ( nr % 2 == 0 ) return ridicare_la_putere_matrice ( inmultire_matrici3 ( A, A ), nr / 2 );
else return inmultire_matrici3 ( A, ridicare_la_putere_matrice ( inmultire_matrici3 ( A, A ), nr / 2 ) );
}
matrice inmultire_matrici3 ( matrice A, matrice B )
{
matrice C;
C.m[0][0] = ( ( A.m[0][0] * B.m[0][0] ) % MOD + ( A.m[0][1] * B.m[1][0] ) % MOD + ( A.m[0][2] * B.m[2][0] ) % MOD ) % MOD;
C.m[0][1] = ( ( A.m[0][0] * B.m[0][1] ) % MOD + ( A.m[0][1] * B.m[1][1] ) % MOD + ( A.m[0][2] * B.m[2][1] ) % MOD ) % MOD;
C.m[0][2] = ( ( A.m[0][0] * B.m[0][2] ) % MOD + ( A.m[0][1] * B.m[1][2] ) % MOD + ( A.m[0][2] * B.m[2][2] ) % MOD ) % MOD;
C.m[1][0] = ( ( A.m[1][0] * B.m[0][0] ) % MOD + ( A.m[1][1] * B.m[1][0] ) % MOD + ( A.m[1][2] * B.m[2][0] ) % MOD ) % MOD;
C.m[1][1] = ( ( A.m[1][0] * B.m[0][1] ) % MOD + ( A.m[1][1] * B.m[1][1] ) % MOD + ( A.m[1][2] * B.m[2][1] ) % MOD ) % MOD;
C.m[1][2] = ( ( A.m[1][0] * B.m[0][2] ) % MOD + ( A.m[1][1] * B.m[1][2] ) % MOD + ( A.m[1][2] * B.m[2][2] ) % MOD ) % MOD;
C.m[2][0] = ( ( A.m[2][0] * B.m[0][0] ) % MOD + ( A.m[2][1] * B.m[1][0] ) % MOD + ( A.m[2][2] * B.m[2][0] ) % MOD ) % MOD;
C.m[2][1] = ( ( A.m[2][0] * B.m[0][1] ) % MOD + ( A.m[2][1] * B.m[1][1] ) % MOD + ( A.m[2][2] * B.m[2][1] ) % MOD ) % MOD;
C.m[2][2] = ( ( A.m[2][0] * B.m[0][2] ) % MOD + ( A.m[2][1] * B.m[1][2] ) % MOD + ( A.m[2][2] * B.m[2][2] ) % MOD ) % MOD;
return C;
}