Cod sursa(job #589111)

Utilizator darrenRares Buhai darren Data 10 mai 2011 21:29:58
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <cstring>
#include <fstream>

using namespace std;

const int MOD = 666013;
typedef long long i64;

int T, N, X, Y, Z, A, B, C;
i64 V1[4][4], V2[4][4], V3[4][4], R[4][4];

void inm1()
{
    for (int i = 1; i <= 3; ++i)
        for (int j = 1; j <= 3; ++j)
            for (int k = 1; k <= 3; ++k)
                R[i][j] += V1[i][k] * V2[k][j], R[i][j] %= MOD;
}
void inm2()
{
    for (int i = 1; i <= 3; ++i)
        for (int j = 1; j <= 3; ++j)
            for (int k = 1; k <= 3; ++k)
                R[i][j] += V2[i][k] * V3[k][j], R[i][j] %= MOD;
}
void logPow(int x)
{
    for (i64 i = 1; i <= x; i <<= 1)
    {
        if (i & x)
        {
            memset(R, 0, sizeof(R));
            inm1();
            memcpy(V1, R, sizeof(V1));
        }

        memset(R, 0, sizeof(R));
        memcpy(V3, V2, sizeof(V3));
        inm2();
        memcpy(V2, R, sizeof(V2));
    }
}

int main()
{
    ifstream fin("iepuri.in");
    ofstream fout("iepuri.out");

    fin >> T;
    while (T--)
    {
        fin >> X >> Y >> Z >> A >> B >> C >> N;

        if (N <= 2)
        {
            if (N == 0) fout << X;
            if (N == 1) fout << Y;
            if (N == 2) fout << Z;

            continue;
        }

        V1[1][1] = 1, V1[2][1] = 0, V1[3][1] = 0;
        V1[1][2] = 0, V1[2][2] = 1, V1[3][2] = 0;
        V1[1][3] = 0, V1[2][3] = 0, V1[3][3] = 1;

        V2[1][1] = A, V2[2][1] = B, V2[3][1] = C;
        V2[1][2] = 1, V2[2][2] = 0, V2[3][2] = 0;
        V2[1][3] = 0, V2[2][3] = 1, V2[3][3] = 0;

        logPow(N - 2);

        memset(R, 0, sizeof(R));

        V2[1][1] = Z, V2[1][2] = Y, V2[1][3] = X;
        for (int i = 1; i <= 3; ++i)
            for (int k = 1; k <= 3; ++k)
                R[1][i] += V2[1][k] * V1[k][i], R[1][i] %= MOD;

        fout << R[1][1] << '\n';
    }

    fin.close();
    fout.close();
}