Cod sursa(job #215480)

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

#define MOD 666013

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

void copy(long long A[3][3], long long 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(long long A[3][3], long long B[3][3])
{
    long long C[3][3], R;
    int i,j,k;
    for(i = 0; i < 3; ++i)
        for(j = 0; j < 3; ++j)
        {
            R = 0;
            for(k = 0; k < 3; ++k)
                R = (R + (A[i][k]*B[k][j])) % MOD;
            C[i][j] = R;
        }
    copy(A, C);
}

int solve(int x, int y, int z, int a, int b, int c, long long n)
{
    long long 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 * A[0][2]) % MOD);
    rez += (int) (((long long) y * A[1][2]) % MOD);
    rez += (int) (((long long) z * 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 %lld",&X, &Y, &Z, &A, &B, &C, &N);
        printf("%d\n",solve(X,Y,Z,A,B,C,N - 2));
    }
}