Cod sursa(job #2981121)

Utilizator Paul281881818818181991919191881818Draghici Paul Paul281881818818181991919191881818 Data 17 februarie 2023 11:40:19
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <fstream>
#include <iostream>
#define MOD 666013
std::ifstream fin("iepuri.in");
std::ofstream fout("iepuri.out");
class matrix{
    public:
    long long int container[3][3] = {0};
    matrix(){}
    matrix(int A, int B, int C){
        container[0][1] = container[1][2] = 1;
        container[2][0] = A;
        container[2][1] = B;
        container[2][2] = C;
    }
    matrix operator* (const matrix& Obj){
        matrix res;
        for(int i = 0; i < 3; i++){
            for(int j = 0; j < 3; j++){
                res.container[i][j] = 0;
                for(int z = 0; z < 3; z++){
                    res.container[i][j] += (container[i][z] * Obj.container[z][j])%MOD;
                    res.container[i][j] %= MOD;
                }
            }
        }
        return res;
    }
    inline int result(int x, int y, int z){
        long long int rez = (container[2][0]*x) % MOD + (container[2][1]*y) % MOD + (container[2][2]*z) % MOD;
        return (rez % MOD);
    }
    friend std::ostream& operator <<(std::ostream& fout, const matrix& Obj){
        for(int i = 0; i < 3; i++){
            for(int j = 0; j < 3; j++){
                fout << Obj.container[i][j] << " ";
            }
            fout << "\n";
        }
        return fout;
    }
};
matrix power(matrix& A , int n){
    matrix res;//unity matrix
    res.container[0][0] = res.container[1][1] = res.container[2][2] = 1;
    while(n){
        if(n%2 == 1){
            res = res * A;
        }
        A = A * A;
        n /= 2;
    }
    return res;
}
int main(){
    
    int T, x, y, z, A, B, C, n;
    fin >> T;
    for(int i=0; i<T; i++){
        fin >> x >> y >> z >> A >> B >> C >> n;
        matrix mat(C, B, A), res_mat;
        res_mat = power(mat, n-2);
        fout << res_mat.result(x, y, z) << "\n";
    }
}