Cod sursa(job #2328841)

Utilizator Teo_1101Mititelu Teodor Teo_1101 Data 26 ianuarie 2019 11:05:06
Problema Iepuri Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <fstream>

using namespace std;

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

const int MOD = 666013;
int init[4][4],mat[4][4],aux[4][4];
int x,y,z,A,B,C,n,N;
void Read()
{
    fin>>x>>y>>z>>A>>B>>C>>n;
}
void Quick_exp( int pow )
{
    if( pow <= 1 ) return;

    Quick_exp( pow / 2 );

    for( int i = 1; i <= 3; ++i )
        for( int j = 1; j <= 3; ++j )
        {
            aux[i][j] = 0;
            for( int J = 1, I = 1; J <= 3; ++J, ++I )
                aux[i][j] += ( 1LL * mat[i][J] * mat[I][j] ) % MOD;

            aux[i][j] %= MOD;
        }

    if( pow % 2 )
    {
        for( int i = 1; i <= 3; ++i )
            for( int j = 1; j <= 3; ++j )
                mat[i][j] = aux[i][j];

        for( int i = 1; i <= 3; ++i )
            for( int j = 1; j <= 3; ++j )
            {
                aux[i][j] = 0;
                for( int J = 1, I = 1; J <= 3; ++J, ++I )
                    aux[i][j] += ( 1LL * mat[i][J] * init[I][j] ) % MOD;

                aux[i][j] %= MOD;
            }
    }

    for( int i = 1; i <= 3; ++i )
        for( int j = 1; j <= 3; ++j )
            mat[i][j] = aux[i][j];
}
int main()
{
    fin>>N;
    for(int i=1; i<=N; ++i)
    {
        Read();
        init[1][1]=init[1][2]=init[2][2]=init[3][1]=0;
        init[2][1]=init[3][2]=1;
        init[1][3]=C;
        init[2][3]=B;
        init[3][3]=A;
        for( int i = 1; i <= 3; ++i )
        for( int j = 1; j <= 3; ++j )
            mat[i][j] = init[i][j];
        Quick_exp(n-2);
        fout<<(1LL*(x*mat[1][3])%MOD+1LL*(y*mat[2][3])%MOD+1LL*(z*mat[3][3])%MOD)%MOD<<"\n";
    }

    return 0;
}