Cod sursa(job #2328840)

Utilizator serafimalex2001Serafim Alex serafimalex2001 Data 26 ianuarie 2019 11:05:06
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <iostream>
#include <fstream>
using namespace std;

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

const int MOD=666013;

int N,x,y,z,A,B,C;

int mat[4][4], aux[4][4], init[4][4];


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()
{
    int p;
    fin>>p;
    for(int k=1; k<=p; ++k)
    {
        fin >> x>> y>> z>> A >>B >>C >> N;

        init[2][1]=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*( 1LL*x*mat[1][3]%MOD + 1LL*y*mat[2][3]%MOD + 1LL*z*mat[3][3]%MOD ) % MOD<<"\n";
    }
    return 0;
}