Cod sursa(job #1260746)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 11 noiembrie 2014 15:47:45
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <fstream>
#define MOD 666013
using namespace std;
ifstream f("iepuri.in");
ofstream g("iepuri.out");
long long Aux[5][5],Z[5][5],M[5][5],M2[5][5];
long long X,Y,K,A,B,C,N;
void mul(long long A[][5],long long B[][5],long long C[][5])
{
    for(long long i=1;i<=3;i++)
        for(long long j=1;j<=3;j++)
        {
            C[i][j]=0;
            for(int k=1;k<=3;k++)
                C[i][j]=(C[i][j]+(1LL*A[i][k]*B[k][j])%MOD)%MOD;

        }
}
void copy(long long A[][5],long long B[][5])
{
for(long long i=1;i<=3;i++)
        for(long long j=1;j<=3;j++)
            A[i][j]=B[i][j];
}
void Solve()
{
    long long i;
    f>>X>>Y>>K;
    f>>A>>B>>C>>N;
    for(long long i=1;i<=3;i++)
        for(long long j=1;j<=3;j++)
            Z[i][j]=M[i][j]=Aux[i][j]=0;
    M[1][1]=1;M[2][2]=1;M[3][3]=1;
    M2[1][1]=X;M2[2][1]=Y;M2[3][1]=K;
    Z[2][1]=Z[3][2]=1;
    Z[1][1]=A;Z[1][2]=B;Z[1][3]=C;
    N-=2;
    while(N)
    {
        if(N%2==1)
        {
            mul(Z,M,Aux);
            copy(M,Aux);
        }
        mul(Z,Z,Aux);
        copy(Z,Aux);
        N/=2;
    }
    g<<(M[1][1]*K+M[1][2]*Y+M[1][3]*X)%MOD<<"\n";
}
int main()
{
    long long T;
    f>>T;
    while(T--)
    {
        Solve();
    }
    return 0;
}