Cod sursa(job #1060717)

Utilizator acomAndrei Comaneci acom Data 18 decembrie 2013 16:00:47
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include<cstdio>
using namespace std;
#define Mod 666013
long long q,a,b,c,x,y,z,n,s;
long long 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(long long A[5][5], long long B[5][5], long long C[5][5])
{
    long long 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(long long A[5][5], long long B[5][5])
{
    long long i,j;
    for (i=1;i<=3;++i)
        for (j=1;j<=3;++j)
            A[i][j]=B[i][j];
}
int main()
{
    long long i;
    freopen("iepuri.in","r",stdin);
    freopen("iepuri.out","w",stdout);
    scanf("%d",&q);
    for (i=0;i<q;++i)
    {
        scanf("%lld%lld%lld %lld%lld%lld %lld",&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("%lld\n",s%Mod);
    }
    return 0;
}