Cod sursa(job #1613383)

Utilizator VladuZ1338Vlad Vlad VladuZ1338 Data 25 februarie 2016 12:57:21
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <fstream>
#include <cstring>

using namespace std;

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

const int mod = 666013;

unsigned long long k, T, X, Y, Z, a, b, c, A[4][4], B[4][4], Zc[4][4], i1, i, j, q, sol;

void pat (int x)
{
    if (x==1)
    {
        for(i=1; i<=3; i++)
        {
             for(j=1; j<=3; j++)
             {
                 B[i][j]=0;
                 for(q=1; q<=3; q++)
                 {
                     B[i][j]=(B[i][j]+A[i][q]*A[q][j]%mod)%mod;
                 }
             }
        }
    }
    if (x==0)
    {
        for(i=1; i<=3; i++)
        {
             for(j=1; j<=3; j++)
             {
                 B[i][j]=0;
                 for(q=1; q<=3; q++)
                 {
                     B[i][j]=(B[i][j]+A[i][q]*Zc[q][j]%mod)%mod;
                 }
             }
        }
    }
    memcpy (A, B, sizeof A);
}

void exp (int k)
{
    if (k==1);
    else if (k%2==0) {exp(k/2); pat(1);}
    else {exp(k-1); pat(0);}
}

int main()
{
    fin >> T;
    for (i1=1; i1<=T; i1++)
    {
        fin >> X >> Y >> Z >> a >> b >> c >> k;
        A[1][1]=A[1][2]=A[2][2]=A[3][1]=Zc[1][1]=Zc[1][2]=Zc[2][2]=Zc[3][1]=0; A[2][1]=A[3][2]=Zc[2][1]=Zc[3][2]=1; A[1][3]=Zc[1][3]=c; A[2][3]=Zc[2][3]=b; A[3][3]=Zc[3][3]=a;
        exp(k-2);
        sol=(X*A[1][3]%mod+Y*A[2][3]%mod+Z*A[3][3]%mod)%mod;
        fout << sol << "\n";
    }
}