Cod sursa(job #1541888)

Utilizator bondoralexandru bondor bondor Data 4 decembrie 2015 17:40:54
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include<cstdio>

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

int M[4][4];
int x, y, z, a, b, c, n;
int t;
int rez[4][4];

#define MOD 666013

void ridicareM(int n){
    int copieRez[4][4];
    int copieM[4][4];
    int s;
    rez[1][2] = rez[1][3] = rez[2][1] = rez[2][3] = rez[3][1] = rez[3][2] = 0;
    rez[1][1] = rez[2][2] = rez[3][3] = 1;
    while(n != 0){
        if(n % 2 == 1){
            --n;
            for(int i = 1; i <= 3; ++i)
                for(int j = 1; j <= 3; ++j)
                    copieRez[i][j] = rez[i][j];
            for(int i = 1; i <= 3; ++i)
                for(int j = 1; j <= 3; ++j){
                    s = 0;
                    for(int k = 1; k <= 3; ++k)
                        s = (s + copieRez[i][k] * M[k][j] % MOD) % MOD;
                    rez[i][j] = s;
                }
        }
        else{
            n /= 2;
            for(int i = 1; i <= 3; ++i)
                for(int j = 1; j <= 3; ++j)
                    copieM[i][j] = M[i][j];
            for(int i = 1; i <= 3; ++i)
                for(int j = 1; j <= 3; ++j){
                    s = 0;
                    for(int k = 1; k <= 3; ++k)
                        s = (s + copieM[i][k] * copieM[k][j] % MOD) % MOD;
                    M[i][j] = s;
                }
        }
    }
}

int solve(int x, int y, int z, int a, int b, int c, int n){
    M[1][1] = 0;
    M[1][2] = 0;
    M[1][3] = c;
    M[2][1] = 1;
    M[2][2] = 0;
    M[2][3] = b;
    M[3][1] = 0;
    M[3][2] = 1;
    M[3][3] = a;
    ridicareM(n - 2);
    return ((x * rez[1][3] % MOD + y * rez[2][3] % MOD + z * rez[3][3] % MOD) % MOD);
}

void read(){
    fscanf(in, "%d", &t);
    for(int i = 1; i <= t; ++i){
        fscanf(in, "%d %d %d %d %d %d %d", &x, &y, &z, &a, &b, &c, &n);
        fprintf(out, "%d\n", solve(x, y, z, a, b, c, n));
    }
}

int main(){
    read();
    return 0;
}