Cod sursa(job #215481)

Utilizator Mishu91Andrei Misarca Mishu91 Data 18 octombrie 2008 21:29:46
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <cstdio>

#define MOD 666013

int X,Y,Z,A,B,C, T;
int N;

void copy(int A[3][3], int C[3][3])
{
    for(int i = 0; i < 3; ++i)
        for(int j = 0; j < 3; ++j)
            A[i][j] = C[i][j];
}

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

    long long R;
    for(i = 0; i < 3; ++i)
        for(j = 0; j < 3; ++j)
        {
            R = 0;
            for(k = 0; k < 3; ++k)
                R = (R + ((long long)A[i][k]*(long long)B[k][j])) % MOD;
            C[i][j] = (int)R;
        }
    copy(A, C);
}

int solve(int x, int y, int z, int a, int b, int c, int n)
{
    int M[3][3], A[3][3] = {0};
    int  rez;
    A[0][0] = A[1][1] = A[2][2] = 1;
    M[1][0] = M[2][1] = 1;
    M[0][2] = c;
    M[1][2] = b;
    M[2][2] = a;
    M[0][0] = M[0][1] = M[1][1] = M[2][0] = 0;

    for(; n; n >>= 1)
    {
        if(n & 1)
            prod(A,M);
        prod(M,M);
    }
    rez = (int) (((long long) x * (long long)A[0][2]) % MOD);
    rez += (int) (((long long) y * (long long)A[1][2]) % MOD);
    rez += (int) (((long long) z * (long long)A[2][2]) % MOD);
    return rez;
}

int main()
{
    freopen("iepuri.in","rt",stdin);
    freopen("iepuri.out","wt",stdout);

    scanf("%d",&T);
    while(T--)
    {
        scanf("%d %d %d %d %d %d %d",&X, &Y, &Z, &A, &B, &C, &N);
        printf("%d\n",solve(X,Y,Z,A,B,C,N - 2));
    }
}