Cod sursa(job #1060716)

Utilizator acomAndrei Comaneci acom Data 18 decembrie 2013 15:57:16
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include<cstdio>
using namespace std;
#define Mod 666013
int q,a,b,c,x,y,z,n,s;
int P[5][5],sol[5][5],aux[5][5],
M[5][5]={
            {0,0,0,0},
            {0,0,0,0},
            {0,1,0,0},
            {0,0,1,0}
        },
I[5][5]={
            {0,0,0,0},
            {0,1,0,0},
            {0,0,1,0},
            {0,0,0,1}
        };
void multiply(int A[5][5], int B[5][5], int C[5][5])
{
    int i,j,k;
    for (i=1;i<=3;++i)
        for (j=1;j<=3;++j)
        {
            C[i][j]=0;
            for (k=1;k<=3;++k)
                C[i][j]+=((A[i][k]%Mod)*(B[k][j]%Mod))%Mod, C[i][j]%=Mod;
        }
}
void mcopy(int A[5][5], int B[5][5])
{
    int i,j;
    for (i=1;i<=3;++i)
        for (j=1;j<=3;++j)
            A[i][j]=B[i][j];
}
int main()
{
    int i;
    freopen("iepuri.in","r",stdin);
    freopen("iepuri.out","w",stdout);
    scanf("%d",&q);
    for (i=0;i<q;++i)
    {
        scanf("%d%d%d %d%d%d %d",&x,&y,&z,&a,&b,&c,&n);
        M[1][1]=a, M[1][2]=b, M[1][3]=c, n-=2, s=0;
        mcopy(sol,I); mcopy(P,M);
        while (n)
        {
            if (n%2)
            {
                multiply(sol,P,aux);
                mcopy(sol,aux);
            }
            multiply(P,P,aux);
            mcopy(P,aux);
            n>>=1;
        }
        s+=z*sol[1][1], s%=Mod;
        s+=y*sol[1][2], s%=Mod;
        s+=x*sol[1][3], s%=Mod;
        printf("%d\n",s%Mod);
    }
    return 0;
}