Cod sursa(job #1541891)

Utilizator bondoralexandru bondor bondor Data 4 decembrie 2015 17:43:38
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.11 kb
#include<cstdio>

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

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

#define MOD 666013

void ridicareM(long long n){
    long long copieRez[4][4];
    long long copieM[4][4];
    long long 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(long long i = 1; i <= 3; ++i)
                for(long long j = 1; j <= 3; ++j)
                    copieRez[i][j] = rez[i][j];
            for(long long i = 1; i <= 3; ++i)
                for(long long j = 1; j <= 3; ++j){
                    s = 0;
                    for(long long k = 1; k <= 3; ++k)
                        s = (s + copieRez[i][k] * M[k][j] % MOD) % MOD;
                    rez[i][j] = s;
                }
        }
        else{
            n /= 2;
            for(long long i = 1; i <= 3; ++i)
                for(long long j = 1; j <= 3; ++j)
                    copieM[i][j] = M[i][j];
            for(long long i = 1; i <= 3; ++i)
                for(long long j = 1; j <= 3; ++j){
                    s = 0;
                    for(long long k = 1; k <= 3; ++k)
                        s = (s + copieM[i][k] * copieM[k][j] % MOD) % MOD;
                    M[i][j] = s;
                }
        }
    }
}

long long solve(long long x, long long y, long long z, long long a, long long b, long long c, long long 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, "%lld", &t);
    for(long long i = 1; i <= t; ++i){
        fscanf(in, "%lld %lld %lld %lld %lld %lld %lld", &x, &y, &z, &a, &b, &c, &n);
        fprintf(out, "%lld\n", solve(x, y, z, a, b, c, n));
    }
}

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