Cod sursa(job #2586592)

Utilizator dariusandreicotaeCotae Darius Andrei dariusandreicotae Data 21 martie 2020 11:12:17
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#include<stdio.h>

#define NMAX 4
#define MOD 666013
#define LL long long

int x, y, z, a, b, c, n, T;
LL Mat[NMAX][NMAX], Rez[NMAX][NMAX], R[NMAX][NMAX];

void EXP(LL A[NMAX][NMAX], LL B[NMAX][NMAX]){
    for(int i = 1; i <= 3; ++ i)
        for(int j = 1; j <= 3; ++ j)
            R[i][j] = 0;
    for(int i = 1; i <= 3; ++ i)
        for(int j = 1; j <= 3; ++ j)
            for(int k = 1; k <= 3; ++ k){
                R[i][j] += 1LL * A[i][k] * B[k][j];
                R[i][j] %= MOD;
                if(R[i][j] < 0)
                    R[i][j] += MOD;
            }
    for(int i = 1; i <= 3; ++ i)
        for(int j = 1; j <= 3; ++ j)
            A[i][j] = R[i][j];
}

int main(){
    freopen("iepuri.in", "r", stdin);
    freopen("iepuri.out", "w", stdout);
    for(scanf("%d", &T); T > 0; -- T){
        scanf("%d %d %d %d %d %d %d", &x, &y, &z, &a, &b, &c, &n);
        Mat[1][1] = Mat[1][2] = Mat[2][2] = Mat[3][1] = 0;
        Mat[2][1] = Mat[3][2] = 1;
        Mat[1][3] = c;
        Mat[2][3] = b;
        Mat[3][3] = a;
        n -= 2;
        for(int i = 1; i <= 3; ++ i)
            for(int j = 1; j <= 3; ++ j)
                if(i == j)
                    Rez[i][j] = 1;
                else
                    Rez[i][j] = 0;
        while(n){
            if(n & 1)
                EXP(Rez, Mat);
            EXP(Mat, Mat);
            n >>= 1;
        }
        printf("%d\n", (1LL * x * Rez[1][3] % MOD + 1LL * y * Rez[2][3] % MOD + 1LL * z * Rez[3][3] % MOD) % MOD);
    }
    return 0;
}