Cod sursa(job #969673)

Utilizator Al3ks1002Alex Cociorva Al3ks1002 Data 4 iulie 2013 23:52:41
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<cstdio>
#include<cstring>
using namespace std;
const int MOD = 666013;
int T,X,Y,Z,A,B,C,N,M[4][4],SOL[4][4],AUX[4][4],REZ,EXP;
long long i;
void Mult(int C[][4],int A[][4],int B[][4])
{
    for(int i=1;i<=3;i++)
        for(int j=1;j<=3;j++)
            for(int k=1;k<=3;k++)
                C[i][j]=(C[i][j]+1LL*A[i][k]*B[k][j])%MOD;
}
int main()
{
    freopen("iepuri.in","r",stdin);
    freopen("iepuri.out","w",stdout);
    scanf("%d",&T);
    for(;T;T--)
    {
        scanf("%d%d%d%d%d%d%d",&X,&Y,&Z,&A,&B,&C,&N);
        memset(M,0,sizeof(M));M[1][3]=C; M[2][3]=B; M[3][3]=A; M[2][1]=M[3][2]=1;
        memset(SOL,0,sizeof(SOL)); SOL[1][1]=SOL[2][2]=SOL[3][3]=1;
        for(EXP=N-2,i=1;i<=EXP;i<<=1)
        {
            if(i&EXP)
            {
                memset(AUX,0,sizeof(AUX));
                Mult(AUX,SOL,M);
                memcpy(SOL,AUX,sizeof(AUX));
            }
            memset(AUX,0,sizeof(AUX));
            Mult(AUX,M,M);
            memcpy(M,AUX,sizeof(AUX));
        }
        REZ=((1LL*X*SOL[1][3])%MOD+(1LL*Y*SOL[2][3])%MOD+(1LL*Z*SOL[3][3])%MOD)%MOD;
        printf("%d\n",REZ);
    }
    return 0;
}