Cod sursa(job #1401472)

Utilizator teo.serbanescuTeo Serbanescu teo.serbanescu Data 25 martie 2015 21:56:19
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <fstream>

using namespace std;

fstream f("iepuri.in", ios::in);
fstream g("iepuri.out", ios::out);

const long long modulo = 666013;

long long t, n, i, j, k, nr, sol[5][5], a[5][5], b[5][5];
long long x, y, z, A, B, C, term;

void exp()
{
    while (n > 0)
    {
        if (n % 2 != 0)
        {
            for (i = 1; i <= 3; i++)
                for (k = 1; k <= 3; k++)
                {
                    b[i][k] = 0;
                    for (j = 1; j <= 3; j++) b[i][k] = (b[i][k] + (sol[i][j] * a[j][k]) % modulo) % modulo;
                }
            for (i = 1; i <= 3; i++)
                for (j = 1; j <= 3; j++)
                {
                    sol[i][j] = b[i][j];
                    b[i][j] = 0;
                }
            n--;
        }
        for (i = 1; i <= 3; i++)
            for (k = 1; k <= 3; k++)
                {
                    b[i][k] = 0;
                    for (j = 1; j <= 3; j++) b[i][k] = (b[i][k] + (a[i][j] * a[j][k]) % modulo) % modulo;
                }
        for (i = 1; i <= 3; i++)
            for (j = 1; j <= 3; j++)
                {
                    a[i][j] = b[i][j];
                    b[i][j] = 0;
                }
        n = n / 2;
    }
}

int main()
{
    f >> t;
    for (nr = 1; nr <= t; nr++)
    {
        f >> x >> y >> z >> A >> B >> C >> n;
        a[1][1] = 0; a[1][2] = 0; a[1][3] = C;
        a[2][1] = 1; a[2][2] = 0; a[2][3] = B;
        a[3][1] = 0; a[3][2] = 1; a[3][3] = A;
        n -= 2;
        for (i = 1; i <= 3; i++)
            for (j = 1; j <= 3; j++) if (i == j) sol[i][j] = 1;
                                        else sol[i][j] = 0;
        exp();
        term = ((sol[1][3] * x) % modulo + (sol[2][3] * y) % modulo + (sol[3][3] * z) % modulo) % modulo;
        g << term << '\n';
    }
    return 0;
}