Cod sursa(job #100948)

Utilizator DastasIonescu Vlad Dastas Data 12 noiembrie 2007 21:01:36
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <cstdio>

const int mod = 666013;

FILE *in = fopen("iepuri.in","r"), *out = fopen("iepuri.out","w");

int t;
int x, y, z, A, B, c, n;

int a[3][3], b[3][3], init[3][3];

void ini()
{
    for ( int i = 0; i < 3; ++i )
        for ( int j = 0; j < 3; ++j )
            a[i][j] = 0;

    a[0][1] = a[1][2] = 1;
    a[2][0] = c;
    a[2][1] = B;
    a[2][2] = A;

    for ( int i = 0; i < 3; ++i )
        for ( int j = 0 ; j < 3 ;++j )
            init[i][j] = a[i][j];
}

void mult(int r[3][3], int c[3][3], int d[3][3])
{
    for ( int i = 0; i < 3; ++i )
        for ( int j = 0; j < 3; ++j )
        {
            r[i][j] = 0;
            for ( int k = 0; k < 3; ++k )
                r[i][j] += c[i][k]*d[k][j], r[i][j] %= mod;
        }
}

void inm(int a[3][3], int p)
{
    if ( p == 1 )
        return;

    if ( p % 2 == 0 )
    {
        inm(a, p/2);
        mult(b, a, a);
        for ( int i = 0; i < 3; ++i )
            for ( int j = 0; j < 3; ++j )
                a[i][j] = b[i][j];
    }
    else
    {
        inm(a, p/2);
        mult(b, a, a);
        for ( int i = 0; i < 3; ++i )
            for ( int j = 0; j < 3; ++j )
                a[i][j] = b[i][j];
        mult(b, a, init);
        for ( int i = 0; i < 3; ++i )
            for ( int j = 0; j < 3; ++j )
                a[i][j] = b[i][j];
    }
}

int main()
{
    fscanf(in, "%d", &t);

    while ( t-- )
    {
        fscanf(in, "%d %d %d %d %d %d %d", &x, &y, &z, &A, &B, &c, &n);

        ini();
        inm(a, n);

        int answ = ((a[0][0] % mod * x % mod) % mod + (a[0][1] % mod * y % mod) % mod + (a[0][2] % mod * z % mod) % mod);

        fprintf(out, "%d\n", answ % mod);
    }


	return 0;
}