Cod sursa(job #1122051)

Utilizator stefan.friptuPetru Stefan Friptu stefan.friptu Data 25 februarie 2014 15:39:28
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <cstdio>
#include <cstring>

#define MOD 666013

using namespace std;

long long A,B,C,x,y,z,n,tc;
long long a[4][4],b[4][4],c[4][4];

void set0 (long long m[4][4])
{
    for(long i=1;i<=3;i++)
        for(long j=1;j<=3;j++)
            m[i][j]=0;
}

void copy (long long dest[4][4],long long src[4][4])
{
    for(long i=1;i<=3;i++)
        for(long j=1;j<=3;j++)
            dest[i][j]=src[i][j];
}

void multiply (long long a[4][4], long long  b[4][4],long long c[4][4])
{
    for(long i=1;i<=3;i++)
        for(long j=1;j<=3;j++)
        {
            c[i][j]=0;
            for(long k=1;k<=3;k++)
                c[i][j]=(c[i][j]+a[i][k]*b[k][j])%MOD;
        }
    copy(a,c);
}

int main()
{
    freopen ("iepuri.in","r",stdin);
    freopen ("iepuri.out","w",stdout);

    scanf("%ld",&tc);

    while(tc--)
    {
        scanf("%lld%lld%lld%lld%lld%lld%lld",&A,&B,&C,&x,&y,&z,&n);
        set0(a);
        set0(b);
        a[1][2]=a[2][3]=1;;
        a[3][1]=z,a[3][2]=y,a[3][3]=x;
        b[1][1]=b[2][2]=b[3][3]=1;
        n=n-2;
        while(n){
            if(n%2)
                multiply(b,a,c);
            multiply(a,a,c);
            n/=2;
        }
        printf("%lld\n",(b[3][1]*A+b[3][2]*B+b[3][3]*C)%MOD);
    }

    return 0;
}