Cod sursa(job #2665638)

Utilizator SoranaAureliaCatrina Sorana SoranaAurelia Data 31 octombrie 2020 10:29:50
Problema Iepuri Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <fstream>
#define MOD 666013
using namespace std;

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

struct Matrice{
    int a[4][4];

    Matrice(int a1, int b, int c){
        a[0][0] = a[0][1] = a[1][1] = a[2][0] = 0;
        a[1][0] = a[2][1] = 1;
        a[2][2] = a1;
        a[1][2] = b;
        a[0][2] = c;
    }
    Matrice(){}
    void zeroz(){
        for(int i=0; i<3; i++)
            for(int j=0; j<3; j++)
                a[i][j] = 0;
    }
    void identity(){
        for(int i=0; i<3; i++){
            for(int j=0; j<3; j++)
                a[i][j] = 0;
            a[i][i] = 1;
        }
    }
    Matrice &operator*(const Matrice &a){
        Matrice rez;
        rez.zeroz();
        for(int i=0; i<3; i++)
            for(int j=0; j<3; j++)
                for(int k=0; k<3; k++)
                    rez.a[i][j] += ((1LL*(this->a[i][k]) * (this->a[k][j]))%MOD);
        return rez;
    }


    Matrice& operator=(const Matrice &b){
        for(int i=0; i<3; i++)
            for(int j=0; j<3; j++)
                this->a[i][j] = b.a[i][j];
        return *this;
    }


};

Matrice inmult(Matrice a, Matrice b){
    Matrice rez;
    rez.zeroz();
    for(int i=0; i<3; i++)
        for(int j=0; j<3; j++)
            for(int k=0; k<3; k++)
                rez.a[i][j] += ((1LL*(a.a[i][k]) * (b.a[k][j]))%MOD);
    return rez;
}

Matrice ridicare_putere(Matrice a, int p){
    Matrice rez;
    rez.identity();
    while(p!=0)
    {
        if(p%2 ==1)
        {
            p--;
            rez=inmult(rez, a);
        }
        p/=2;
        a=inmult(a, a);
    }
    return rez;
}


int main()
{
    int t, x, y, z, a, b, c, n;
    f>>t;
    for(int i=0; i<t; i++){
        f>>x>>y>>z>>a>>b>>c>>n;
        Matrice a1 = Matrice(a, b, c);
        Matrice rez = ridicare_putere(a1, n-2);

        g<<(x*rez.a[0][2]%MOD + y*rez.a[1][2]%MOD + z*rez.a[2][2]%MOD)%MOD<<'\n';

    }

    return 0;
}