Cod sursa(job #2330210)

Utilizator mihaialex14Dima Mihai mihaialex14 Data 28 ianuarie 2019 08:20:27
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 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;
}