Cod sursa(job #2592479)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 1 aprilie 2020 18:47:42
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <iostream>
#include <fstream>

const int MOD = 666013;

using namespace std;

ifstream in("iepuri.in");
ofstream out("iepuri.out");

typedef int matrice[3][3];

int x,y,z,a,b,c,n;

void inmulteste(matrice a,matrice b){
    matrice c;
    for(int i = 0; i < 3; i++){
        for(int j = 0; j < 3; j++){
            c[i][j] = 0;
            for(int k = 0; k < 3; k++)
                c[i][j] = (c[i][j] + 1ll * a[i][k] * b[k][j] % MOD) % MOD;
        }
    }
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
            a[i][j] = c[i][j];

}
void exponentiere(matrice rez,matrice baza,int exponent){
    while(exponent){
        if(exponent % 2 == 0){
            inmulteste(baza,baza);
        }else{
            inmulteste(rez,baza);
            inmulteste(baza,baza);
        }
        exponent /= 2;
    }


}

void solve(){
    matrice initial = {{0,0,c},{1,0,b},{0,1,a}};
    matrice rez = {{1,0,0},{0,1,0},{0,0,1}};
    exponentiere(rez,initial,n - 2);

    if(n == 1)
        out<<x<<"\n";
    else if(n == 2)
        out<<y<<"\n";
    else{
        int raspuns = (1ll * rez[0][2] * x % MOD + 1ll * rez[1][2] * y % MOD + 1ll * rez[2][2] * z % MOD) % MOD;
        out<<raspuns<<"\n";
    }
}

int main()
{
    int t;
    in>>t;
    for(int i = 1; i <= t; i++){
        in>>x>>y>>z>>a>>b>>c>>n;
        solve();
    }
    return 0;
}