Cod sursa(job #1387557)

Utilizator lacraruraduRadu Matei Lacraru lacraruradu Data 14 martie 2015 14:11:58
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <fstream>

using namespace std;

ifstream in("iepuri.in");
ofstream out("iepuri.out");

#define MOD 666013

int t, x, y, z, a, b, c, n;
int mat[3][3];

void inmultire(int rez[3][3], int a[3][3], int b[3][3])
{
    long long aux[3][3];

    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
        {
            aux[i][j] = 0;
            for(int k = 0; k < 3; k++)
                aux[i][j] += (long long)a[i][k] * b[k][j];
            aux[i][j] %= MOD;
        }

    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
            rez[i][j] = aux[i][j];
}

void putere(int p)
{
    if(p == 1)
        return;
    if(p == 0)
    {
        for(int i = 0; i < 3; i++)
            for(int j = 0; j < 3; j++)
                mat[i][j] = ((i ^ j) == 0);
        return;
    }

    if(p % 2)
    {
        int aux[3][3];
        for(int i = 0; i < 3; i++)
            for(int j = 0; j < 3; j++)
                aux[i][j] = mat[i][j];
        inmultire(mat, mat, mat);
        putere(p / 2);
        inmultire(mat, aux, mat);
        return;
    }
    inmultire(mat, mat, mat);
    putere(p / 2);
}

int main()
{
    in >> t;

    while(t--)
    {
        in >> x >> y >> z >> a >> b >> c >> n;

        if(n == 0)
        {
            out << x << '\n';
            continue;
        }
        if(n == 1)
        {
            out << y << '\n';
            continue;
        }

        for(int i = 0; i < 3; i++)
            for(int j = 0; j < 3; j++)
                mat[i][j] = 0;
        mat[0][2] = c;
        mat[1][2] = b;
        mat[2][2] = a;
        mat[1][0] = 1;
        mat[2][1] = 1;

        putere(n - 2);

        long long rez = (long long)x * mat[0][2] + (long long)y * mat[1][2] + (long long)z * mat[2][2];
        rez %= MOD;
        out << rez << '\n';
    }
    return 0;
}