Cod sursa(job #1943715)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 28 martie 2017 19:24:36
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <fstream>
#define MOD 666013
#define LL long long

using namespace std;

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

int T, i, N;
LL A, B, C, X, Y, Z;
LL sol[4][4], exp[4][4];;
LL ans;

void initializare()
{
    sol[1][1]=exp[1][1]=A;
    sol[2][1]=exp[2][1]=B;
    sol[3][1]=exp[3][1]=C;
    sol[1][2]=sol[2][3]=exp[1][2]=exp[2][3]=1;
    sol[1][3]=sol[2][2]=sol[3][2]=sol[3][3]=exp[1][3]=exp[2][2]=exp[3][2]=exp[3][3]=0;
}

void Multiply_Matrix()
{
    LL mat[4][4];
    int i, j, k;
    for (i=1; i<=3; i++)
    {
        for (j=1; j<=3; j++)
        {
            mat[i][j]=0;
            for (k=1; k<=3; k++)
            {
                mat[i][j]+=(sol[i][k]*exp[k][j]) % MOD;
                mat[i][j]%=MOD;
            }
        }
    }
    for (i=1; i<=3; i++)
      for (j=1; j<=3; j++)
        sol[i][j]=mat[i][j];
}

void Multiply_Square()
{
    LL mat[4][4];
    int i, j, k;
    for (i=1; i<=3; i++)
    {
        for (j=1; j<=3; j++)
        {
            mat[i][j]=0;
            for (k=1; k<=3; k++)
            {
                mat[i][j]+=(exp[i][k]*exp[k][j]) % MOD;
                mat[i][j]%=MOD;
            }
        }
    }
    for (i=1; i<=3; i++)
      for (j=1; j<=3; j++)
        exp[i][j]=mat[i][j];
}

void LogPow(int N)
{
    while (N!=0)
    {
        if (N % 2==1)
        {
            Multiply_Matrix();
            N--;
        }
        Multiply_Square();
        N/=2;
    }
}

int main()
{
    fin >> T;
    for (i=1; i<=T; i++)
    {
        fin >> X >> Y >> Z >> A >> B >> C >> N;
        initializare();
        LogPow(N-3);
        ans=(Z*sol[1][1]) % MOD;
        ans+=(Y*sol[2][1]) % MOD;
        ans+=(X*sol[3][1]) % MOD;
        ans%=MOD;
        fout << ans << '\n';
    }
    fin.close();
    fout.close();
    return 0;
}