Cod sursa(job #2695122)

Utilizator razviOKPopan Razvan Calin razviOK Data 11 ianuarie 2021 20:47:06
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <iostream>
#include <fstream>
#define Mod 666013
using namespace std;
ifstream f("iepuri.in");
ofstream g("iepuri.out");
long long M[4][4];
long long I3[4][4];
long long Rez[4][4];
int T,X,Y,Z,A,B,C,N;
void Solve()
{
    while(N)
    {
        Rez[1][1]=Rez[1][2]=Rez[1][3]=Rez[2][1]=Rez[2][2]=Rez[2][3]=Rez[3][1]=Rez[3][2]=Rez[3][3]=0;
        if(N%2)
        {
            for(int i=1; i<=3; i++)                  //I3=I3*M
                for(int j=1; j<=3; j++)
                    for(int k=1; k<=3; k++)
                        Rez[i][j]=(Rez[i][j]+(I3[i][k]*M[k][j])%Mod)%Mod;

            for(int i=1; i<=3; i++)
                for(int j=1; j<=3; j++)
                    I3[i][j]=Rez[i][j];
        }
        Rez[1][1]=Rez[1][2]=Rez[1][3]=Rez[2][1]=Rez[2][2]=Rez[2][3]=Rez[3][1]=Rez[3][2]=Rez[3][3]=0;

        for(int i=1; i<=3; i++)
            for(int j=1; j<=3; j++)                        //M=M*M
                for(int k=1; k<=3; k++)
                    Rez[i][j]=(Rez[i][j]+(M[i][k]*M[k][j])%Mod)%Mod;

        for(int i=1; i<=3; i++)
            for(int j=1; j<=3; j++)
                M[i][j]=Rez[i][j];

        N/=2;

    }
}
int main()
{
    f>>T;
    for(int q=0; q<T; q++)
    {
        f>>X>>Y>>Z>>A>>B>>C>>N;

        M[1][1]= M[2][2]=M[2][1]=M[1][3]=0;
        M[1][2]=M[2][3]=1;
        M[3][1]=C;                                                       //initializez matricele
        M[3][2]=B;
        M[3][3]=A;
        I3[1][1]=I3[2][2]=I3[3][3]=1;
        I3[1][2]=I3[1][3]=I3[2][1]=I3[2][3]=I3[3][1]=I3[3][2]=0;

        N-=2;
        if(N>0)
            Solve();
        g<<((I3[3][1]*X)%Mod+(I3[3][2]*Y)%Mod+(I3[3][3]*Z)%Mod)%Mod<<'\n';
    }
    return 0;
}