Cod sursa(job #2328837)

Utilizator AlexTudorAlex Brinza AlexTudor Data 26 ianuarie 2019 11:04:22
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <bits/stdc++.h>
using namespace std;

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

const int MOD=666013;

int mat[4][4],aux[4][4],init[4][4];
int x,y,z,a,b,c,n;

void expo(int pow)
{
    if(pow <= 1) return;

    expo(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 task;
    fin>>task;
    for(int i = 1; i <= task; ++i)
    {
        fin >> x >> y >> z >> a >> b >> c >> n;

         init[1][1]=init[3][1]=init[1][2]=init[2][2]=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];

        expo(n-2);

        fout<< ( 1LL* x * mat[1][3] + 1LL* y * mat[2][3] + 1LL* z * mat[3][3] ) % MOD<<"\n";
    }
    return 0;
}