Cod sursa(job #790867)

Utilizator vlad96Vlad Zuga vlad96 Data 22 septembrie 2012 15:42:43
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include<stdio.h>

using namespace std;

#define MOD 666013

long long A[4][4], B[4][4], C[4][4], n;
int a, b, c, x, y, z, t, i, j, k;

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

void read ()
{
    fscanf(fis, "%d %d %d %d %d %d %lld", &x, &y, &z, &a, &b, &c, &n);
    for(i = 1; i <= 3; ++i)
        for(j = 1; j <= 3; ++j)
            A[i][j] = B[i][j] = C[i][j] = 0;
    A[1][1] = z, A[2][1] = y, A[3][1] = x;
    B[1][1] = a, B[1][2] = b, B[1][3] = c;
    B[2][1] = 1, B[3][2] = 1;
}

void write ()
{
    fprintf(fis2, "%d\n", A[1][1]);
}

void solve ()
{
    n -= 2;
    while ( n )
    {
        if ( n % 2 )
        {
            for ( i = 1; i <= 3; i ++ )
                for ( j = 1; j <= 3; j ++ )
                    for ( k = 1; k <= 3; k ++ )
                        C[i][j] += A[k][j] * B[i][k], C[i][j] %= MOD;

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

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

        for ( i = 1; i <= 3; i ++ )
            for ( j = 1; j <= 3; j ++ )
                B[i][j] = C[i][j], C[i][j] = 0;

        n /= 2;
    }
}

int main ()
{
    fscanf(fis, "%d\n", &t);
    while (t)
    {
        read();
        solve();
        write();
        t--;
    }
    fclose(fis);
    fclose(fis2);
    return 0;
}