Cod sursa(job #1792606)

Utilizator Vally77FMI Calinescu Valentin Gelu Vally77 Data 30 octombrie 2016 16:18:38
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
//#include <iostream>
#include <fstream>
using namespace std;
ifstream ka("iepuri.in");
ofstream ki("iepuri.out");

const int MOD = 666013;

int tt;
long long x, y, z, a, b, c, n;
long long sol[3][3], orig[3][3], temp_sol[3][3];
long long aia[3], sol_fin[3];

void raise_to_power(int t)
{
    if(t > 1)
    {
        raise_to_power(t / 2);
        for(int i = 0; i < 3; i++)
            for(int j = 0; j < 3; j++)
                temp_sol[i][j] = 0;

        for(int i = 0; i < 3; i++)
            for(int j = 0; j < 3; j++)
            {
                for(int z = 0; z < 3; z++)
                    temp_sol[i][j] += (sol[i][z] * sol[z][j]) % MOD;
                temp_sol[i][j] %= MOD;
            }

        for(int i = 0; i < 3; i++)
            for(int j = 0; j < 3; j++)
                sol[i][j] = temp_sol[i][j];

        if(t % 2 == 1)
        {
            for(int i = 0; i < 3; i++)
                for(int j = 0; j < 3; j++)
                    temp_sol[i][j] = 0;

            for(int i = 0; i < 3; i++)
                for(int j = 0; j < 3; j++)
                {
                    for(int z = 0; z < 3; z++)
                        temp_sol[i][j] += (sol[i][z] * orig[z][j]) % MOD;
                    temp_sol[i][j] %= MOD;
                }

            for(int i = 0; i < 3; i++)
                for(int j = 0; j < 3; j++)
                    sol[i][j] = temp_sol[i][j];
        }
    }
}

int main()
{
    ka >> tt;
    while(tt--)
    {
        ka >> x >> y >> z >> c >> b >> a >> n;
        sol[0][0] = 0;
        sol[0][1] = 0;
        sol[0][2] = a;
        sol[1][0] = 1;
        sol[1][1] = 0;
        sol[1][2] = b;
        sol[2][0] = 0;
        sol[2][1] = 1;
        sol[2][2] = c;
        for(int i = 0; i < 3; i++)
            for(int j = 0; j < 3; j++)
                orig[i][j] = sol[i][j];
        n -= 2;
        raise_to_power(n);

        long long aia[3] = {x, y, z};
        long long fin[3] = {0, 0 ,0};

        for(int j = 0; j < 3; j++)
        {
            for(int kl = 0; kl < 3; kl++)
                fin[j] += (aia[kl] * sol[kl][j]) % MOD;
            fin[j] %= MOD;
        }
        ki << fin[2] << '\n';
    }
}