Cod sursa(job #2210967)

Utilizator caesar2001Stoica Alexandru caesar2001 Data 8 iunie 2018 20:25:02
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("iepuri.in");
ofstream out("iepuri.out");

const long long modulo = 666013;
long long mat[4][4], sol[4][4], aux[4][4], start[4][4];

int main() {
    int teste;
    in >> teste;
    while(teste --) {
        memset(mat, 0, sizeof mat);
        memset(sol, 0, sizeof sol);
        memset(start, 0, sizeof start);
        int x, y, z, a, b, c, n;
        in >> x >> y >> z >> a >> b >> c >> n;
        mat[1][2] = mat[2][3] = 1, mat[3][1] = c, mat[3][2] = b, mat[3][3] = a, sol[1][1] = 1, sol[2][2] = 1, sol[3][3] = 1;
        start[1][1] = x, start[2][1] = y, start[3][1] = z;
        n -= 2;
        while(n) {
            if(n % 2) {
                memset(aux, 0, sizeof aux);
                for(int i = 1; i <= 3; i ++)
                    for(int j = 1; j <= 3; j ++)
                        for(int k = 1; k <= 3; k ++)
                            aux[i][j] = (aux[i][j] + sol[i][k] * mat[k][j]) % modulo;
                memcpy(sol, aux, sizeof aux);
            }
            memset(aux, 0, sizeof aux);
            for(int i = 1; i <= 3; i ++)
                for(int j = 1; j <= 3; j ++)
                    for(int k = 1; k <= 3; k ++)
                        aux[i][j] = (aux[i][j] + mat[i][k] * mat[k][j]) % modulo;
            memcpy(mat, aux, sizeof aux);
            n /= 2;
        }

        memset(aux, 0, sizeof aux);
        for(int i = 1; i <= 3; i ++)
            for(int j = 1; j <= 1; j ++)
                for(int k = 1; k <= 3; k ++)
                    aux[i][j] = (aux[i][j] + sol[i][k] * start[k][j]) % modulo;
        out << aux[3][1] << "\n";
    }


    return 0;
}