Cod sursa(job #1793707)

Utilizator andreiugravuFMI Andrei Zugravu andreiugravu Data 31 octombrie 2016 13:49:58
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
//Iepuri

#include <fstream>

using namespace std;

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

#define MOD 666013

long long T, X, Y, Z, a, b, c, N;

void matrixExponentiation(long long A[3][3], long long N) {
    if(N == 1) {
        A[0][0] = 0; A[0][1] = 1; A[0][2] = 0;
        A[1][0] = 0; A[1][1] = 0; A[1][2] = 1;
        A[2][0] = c; A[2][1] = b; A[2][2] = a;

        return;
    }

    int i, j, k;
    long long temp[3][3]={0};

    if(N%2 == 0) {
        matrixExponentiation(A, N/2);
        for(i = 0 ; i < 3 ; i++)
            for(k = 0 ; k < 3 ; k++)
                for(j = 0 ; j < 3 ; j++) {
                    temp[i][k] += (A[i][j]*A[j][k])%MOD;
                    temp[i][k] %= MOD;
                }

        for(i = 0 ; i < 3 ; i++)
            for(j = 0 ; j < 3 ; j++)
                A[i][j] = temp[i][j];

        return;
    }

    if(N%2 == 1) {
        matrixExponentiation(A, N-1);
        temp[0][0] = A[1][0]; temp[0][1] = A[1][1]; temp[0][2] = A[1][2];
        temp[1][0] = A[2][0]; temp[1][1] = A[2][1]; temp[1][2] = A[2][2];
        temp[2][0] = (c*A[0][0] + b*A[1][0] + a*A[2][0])%MOD;
        temp[2][1] = (c*A[0][1] + b*A[1][1] + a*A[2][1])%MOD;
        temp[2][2] = (c*A[0][2] + b*A[1][2] + a*A[2][2])%MOD;

        for(i = 0 ; i < 3 ; i++)
            for(j = 0 ; j < 3 ; j++)
                A[i][j] = temp[i][j];

        return;
    }
}

int main()
{
    long long A[3][3], i;

    fin>>T;
    for(i = 1 ; i <= T ; i++) {
        fin>>X>>Y>>Z>>a>>b>>c>>N;
        matrixExponentiation(A, N-2);
        fout<<(A[2][0]*X + A[2][1]*Y + A[2][2]*Z)%MOD<<'\n';
    }

    fin.close();
    fout.close();

    return 0;
}