Cod sursa(job #406220)

Utilizator cristiprgPrigoana Cristian cristiprg Data 1 martie 2010 12:31:14
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <cstdio>
const int MOD = 666013;
long long X, Y, Z, A, B, C, n, T;

struct matrice
{
    long long a11, a12, a13, a21, a22, a23, a31, a32, a33;
};

matrice inmultire(matrice A, matrice B)
{
    matrice C;
    C.a11 = ((A.a11 * B.a11) % MOD + (A.a12 * B.a21) % MOD + (A.a13 * B.a31) % MOD ) % MOD;
    C.a12 = ((A.a11 * B.a12) % MOD + (A.a12 * B.a22) % MOD + (A.a13 * B.a32) % MOD ) % MOD;
    C.a13 = ((A.a11 * B.a13) % MOD + (A.a12 * B.a23) % MOD + (A.a13 * B.a33) % MOD ) % MOD;
    C.a21 = ((A.a21 * B.a11) % MOD + (A.a22 * B.a21) % MOD + (A.a23 * B.a31) % MOD ) % MOD;
    C.a22 = ((A.a21 * B.a12) % MOD + (A.a22 * B.a22) % MOD + (A.a23 * B.a32) % MOD ) % MOD;
    C.a23 = ((A.a21 * B.a13) % MOD + (A.a22 * B.a23) % MOD + (A.a23 * B.a33) % MOD ) % MOD;
    C.a31 = ((A.a31 * B.a11) % MOD + (A.a32 * B.a21) % MOD + (A.a33 * B.a31) % MOD ) % MOD;
    C.a32 = ((A.a31 * B.a12) % MOD + (A.a32 * B.a22) % MOD + (A.a33 * B.a32) % MOD ) % MOD;
    C.a33 = ((A.a31 * B.a13) % MOD + (A.a32 * B.a23) % MOD + (A.a33 * B.a33) % MOD ) % MOD;
    return C;
}

matrice pow(matrice M, int n)
{
    if (n == 1)
        return M;
    if (n%2 == 1)
       return inmultire(pow(M, n-1), M);

    matrice aux = pow(M, n/2);
    return inmultire(aux, aux);
}

int main()
{
    FILE *f = fopen("iepuri.in", "r"), *fout = fopen("iepuri.out", "w");;
    fscanf(f, "%d", &T);
    matrice M;
    for (;T;--T)
    {
        fscanf(f, "%d%d%d%d%d%d%d", &X, &Y, &Z, &A, &B, &C, &n);
        M.a11 = 0, M.a12 = 1, M.a13 = 0, M.a21 = 0, M.a22 = 0, M.a23 = 1, M.a31 = C, M.a32 = B, M.a33 = A;
        M = pow(M, n-2);
        int R = ((M.a31 * X) % MOD + (M.a32 * Y) % MOD + (M.a33 * Z)%MOD)%MOD;
        fprintf (fout, "%d\n", R);
    }
    fclose(f);
    fclose(fout);
    return 0;
}