Cod sursa(job #347306)

Utilizator silvia_the_bestSilvia Pripoae silvia_the_best Data 11 septembrie 2009 18:39:29
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <cstdio>

#define FIN "iepuri.in"
#define FOUT "iepuri.out"

#define MOD 666013

int a, b, c, x, y, z, n;
long long M[3][3], R[3][3];

void mul(long long A[3][3], long long B[3][3])
{
    int i, j, k, C[3][3];

    for (i = 0; i < 3; ++ i)
        for (j = 0 ; j < 3; ++ j)
            for (k = 0, C[i][j] = 0; k < 3; ++ k)
                C[i][j] = 1LL * (C[i][j] + (A[i][k] * B[k][j]) % MOD) % MOD;

    for (i = 0; i < 3; ++ i)
        for (j = 0; j < 3; ++ j)
            A[i][j] = C[i][j];
}

int main()
{
    int p, i, t, j, k;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    scanf("%d", &t);

    for (i = 1; i <= t; ++i)
    {
        scanf("%d%d%d%d%d%d%d", &x, &y, &z, &a, &b, &c, &n);

        M[0][0] = M[0][1] = M[1][1] = M[2][0] = 0;
        M[1][0] = M[2][1] = 1;
        M[0][2] = c; M[1][2] = b; M[2][2] = a;

        for (j = 0; j < 3; ++ j)
            for (k = 0; k < 3; ++ k)
                if (j != k)
                    R[j][k] = 0;
                else
                    R[j][k] = 1;

        for (p = n - 2; p ; p /= 2)
        {
            if (p & 1)
                mul(R, M);

            mul(M, M);
        }

        printf("%lld\n", 1LL * ((x * R[0][2]) % MOD + (y * R[1][2]) % MOD + (z * R[2][2]) % MOD ) % MOD);
    }
}