Cod sursa(job #1141372)

Utilizator thewildnathNathan Wildenberg thewildnath Data 12 martie 2014 20:30:48
Problema Iepuri Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include<stdio.h>
#include<string.h>

#define MOD 666013

int n,a,b,c,x,y,z;
int original[3][3]=
{
    {0,1,0},
    {0,0,1},
    {0,0,0} /* A,B,C */
},mat[3][3],cop[3][3],aux[3][3];

void inm(int a[3][3],int b[3][3],int c[3][3])
{
    int i,j,k;
    for(i=0;i<=2;++i)
        for(j=0;j<=2;++j)
            for(k=0;k<=2;++k)
                c[i][j]=(c[i][j]+(long long)a[i][k]*b[k][j])%MOD;
}

void exp(int p)
{
    int i;

    memcpy(cop,mat,sizeof(mat));
    memset(mat,0,sizeof(mat));

    for(i=0;i<=2;++i)
        mat[i][i]=1;

    while(p)
    {
        if(p&1)
        {
            memset(aux,0,sizeof(aux));
            inm(cop,mat,aux);
            memcpy(mat,aux,sizeof(aux));
        }
        memset(aux,0,sizeof(aux));
        inm(cop,cop,aux);
        memcpy(cop,aux,sizeof(aux));

        p>>=1;
    }
}

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

    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d%d%d%d%d",&x,&y,&z,&a,&b,&c,&n);

        memcpy(mat,original,sizeof(original));
        mat[2][0]=c;
        mat[2][1]=b;
        mat[2][2]=a;

        exp(n-2);

        sol=(mat[2][0]*x+mat[2][1]*y+mat[2][2]*z)%MOD;

        printf("%d\n",sol);
    }

    return 0;
}