Cod sursa(job #1215700)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 1 august 2014 21:08:28
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
using namespace std;
#include <fstream>
ifstream fin("iepuri.in");
ofstream fout("iepuri.out");
const int MOD = 666013;

int fact[3][3], aux[3][3], rez[3][3];

void putere(int) ;
void prod(int a[3][3], int b[3][3], int c[3][3]) ;
void cpy(int a[3][3], int b[3][3]) ;

int main()
{
    int a, b, c, x, y, z, n, t;
    fin >> t;

    for(; t; --t)
    {
        fin >> x >> y >> z >> a >> b >> c >> n;
        fact[0][0] = 0; fact[0][1] = 0; fact[0][2] = c;
        fact[1][0] = 1; fact[1][1] = 0; fact[1][2] = b;
        fact[2][0] = 0; fact[2][1] = 1; fact[2][2] = a;
        putere(n);
        fout << (x * rez[0][0] + y * rez[1][0] + z * rez[2][0]) % MOD << '\n';
    }
    return 0;
}

void putere(int exp)
{
    for(int i = 0; i < 3; ++i) for(int j = 0; j < 3; ++j) rez[i][j] = 0;
    rez[0][0] = rez[1][1] = rez[2][2] = 1;
    while(exp)
    {
        if(exp & 1 == 1)
        {
            prod(rez, fact, aux); //aux = rez * fact
            cpy(rez, aux);
        }
        exp >>= 1;
        prod(fact, fact, aux);
        cpy(fact, aux);
    }
}

void prod(int a[3][3], int b[3][3], int c[3][3])
{
    //c = a * b
    c[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0] + a[0][2] * b[2][0]; c[0][0] %= MOD;
    c[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1] + a[0][2] * b[2][1]; c[0][1] %= MOD;
    c[0][2] = a[0][0] * b[0][2] + a[0][1] * b[1][2] + a[0][2] * b[2][2]; c[0][2] %= MOD;
    c[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0] + a[1][2] * b[2][0]; c[1][0] %= MOD;
    c[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1] + a[1][2] * b[2][1]; c[1][1] %= MOD;
    c[1][2] = a[1][0] * b[0][2] + a[1][1] * b[1][2] + a[1][2] * b[2][2]; c[1][2] %= MOD;
    c[2][0] = a[2][0] * b[0][0] + a[2][1] * b[1][0] + a[2][2] * b[2][0]; c[2][0] %= MOD;
    c[2][1] = a[2][0] * b[0][1] + a[2][1] * b[1][1] + a[2][2] * b[2][1]; c[2][1] %= MOD;
    c[2][2] = a[2][0] * b[0][2] + a[2][1] * b[1][2] + a[2][2] * b[2][2]; c[2][2] %= MOD;
}

void cpy(int a[3][3], int b[3][3])
{
    for(int i = 0; i < 3; ++i)
        for(int j = 0; j < 3; ++j)
            a[i][j] = b[i][j];
}