Cod sursa(job #1408737)

Utilizator Toast97Calin Farcas Toast97 Data 30 martie 2015 11:05:24
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <fstream>

using namespace std;

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

const int MOD = 666013;

long long R[4][4], P[4][4], t, x, y, z, a, b, c, n;

void initializare ()
{
    R[1][1] = R[2][2] = R[3][3] = 1;
    R[1][2] = R[1][3] = R[2][1] = R[2][3] = R[3][1] = R[3][2] = 0;

    P[2][1] = P[3][2] = 1;
    P[1][3] = c;
    P[2][3] = b;
    P[3][3] = a;
    P[1][1] = P[1][2] = P[2][2] = P[3][1] = 0;
}

void inmulteste (long long X[4][4], long long Y[4][4])
{
    int Z[4][4];

    Z[1][1] = X[1][1] * Y[1][1] + X[1][2] * Y[2][1] + X[1][3] * Y[3][1];
    Z[1][2] = X[1][1] * Y[1][2] + X[1][2] * Y[2][2] + X[1][3] * Y[3][2];
    Z[1][3] = X[1][1] * Y[1][3] + X[1][2] * Y[2][3] + X[1][3] * Y[3][3];

    Z[2][1] = X[2][1] * Y[1][1] + X[2][2] * Y[2][1] + X[2][3] * Y[3][1];
    Z[2][2] = X[2][1] * Y[1][2] + X[2][2] * Y[2][2] + X[2][3] * Y[3][2];
    Z[2][3] = X[2][1] * Y[1][3] + X[2][2] * Y[2][3] + X[2][3] * Y[3][3];

    Z[3][1] = X[3][1] * Y[1][1] + X[3][2] * Y[2][1] + X[3][3] * Y[3][1];
    Z[3][2] = X[3][1] * Y[1][2] + X[3][2] * Y[2][2] + X[3][3] * Y[3][2];
    Z[3][3] = X[3][1] * Y[1][3] + X[3][2] * Y[2][3] + X[3][3] * Y[3][3];

    X[1][1] = Z[1][1] % MOD;
    X[1][2] = Z[1][2] % MOD;
    X[1][3] = Z[1][3] % MOD;
    X[2][1] = Z[2][1] % MOD;
    X[2][2] = Z[2][2] % MOD;
    X[2][3] = Z[2][3] % MOD;
    X[3][1] = Z[3][1] % MOD;
    X[3][2] = Z[3][2] % MOD;
    X[3][3] = Z[3][3] % MOD;
}

int main()
{
    f >> t;

    for (int i = 1; i <= t; i ++)
    {
        f >> x >> y >> z >> a >> b >> c >> n;

        initializare ();

        n -= 2;

        while (n > 0)
        {
            if (n & 1)
                inmulteste (R, P);

            n >>= 1;
            inmulteste (P, P);
        }

        if (n > 0)
            g << ((x * R[1][3]) % MOD + (y * R[2][3]) % MOD + (z * R[3][3]) % MOD) % MOD << '\n';
        else if (! n)
            g << z << '\n';
        else if (n == -1)
            g << y << '\n';
        else
            g << x << '\n';
    }

    f.close ();
    g.close ();
    return 0;
}