Cod sursa(job #497233)

Utilizator doru.nituNitu Doru Constantin doru.nitu Data 1 noiembrie 2010 21:24:09
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include<cstdio>
#define mod 666013

int i,t;
long long p[4][4],r[4][4];

void inmul(long long  a[][4],long long b[][4])
{
    int m[4][4],i=0,j=0,k=0;

    for(i=1;i<=3;++i)
        for(j=1;j<=3;++j)
            m[i][j]=0;

    for(i=1;i<=3;++i)
        for(j=1;j<=3;++j)
            for(k=1;k<=3;++k)
                {
                    m[i][j]+=((a[i][k]*b[k][j])%mod);
                    m[i][j]%=mod;
                }

    for(i=1;i<=3;++i)
        for(j=1;j<=3;++j)
        p[i][j]=m[i][j];
}

void ridica(int k)
{
    if(k==1) return ;

    if(k%2==0)
    {
        ridica(k/2);
        inmul(p,p);
    }
    else
    {
        ridica((k-1)/2);
        inmul(p,p);
        inmul(p,r);
    }
}

void rezolva()
{
    int a,b,c,x,y,z,n;

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

    p[1][1]=r[1][1]=(long long)(a);
    p[2][1]=r[2][1]=(long long)(b);
    p[3][1]=r[3][1]=(long long)(c);

    p[1][2]=r[1][2]=1;
    p[2][2]=p[3][2]=r[2][2]=r[3][2]=0;

    p[1][3]=r[1][3]=0;
    p[2][3]=r[2][3]=1;
    p[3][3]=r[3][3]=0;

    ridica(n-2);

    int  rez=((z*p[1][1])%mod+(y*p[2][1])%mod+(x*p[3][1])%mod)%mod;
    printf("%d\n",rez);
}

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

    scanf("%d",&t);

    for(i=1;i<=t;++i)
        rezolva();

    fclose(stdin);
    fclose(stdout);

    return 0;
}