Cod sursa(job #286238)

Utilizator ZillaMathe Bogdan Zilla Data 23 martie 2009 16:47:41
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <stdio.h>

long long mod=666013;

int t;
long long zi1,zi2,zi3,zifin,m1[4][4],m2[4][4];

void mul1()
{
    long long c[4][4];
    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]=(long long)((long long)(c[i][j]%mod)+(long long)((long long)(m1[i][k]*m1[k][j])%mod))%mod;
            }
    for(i=1;i<=3;++i)
        for(j=1;j<=3;++j)
            m1[i][j]=c[i][j];
}

void mul2()
{
    long long c[4][4];
    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]=(long long)((long long)((long long)c[i][j]%mod)+(long long)((long long)((long long)m2[i][k]*(long long)m1[k][j])%mod))%mod;
            }
    for(i=1;i<=3;++i)
        for(j=1;j<=3;++j)
                    m2[i][j]=c[i][j];
}

int main()
{
    freopen("iepuri.in","r",stdin);
    freopen("iepuri.out","w",stdout);
    int i,X,Y,Z,A,B,C,N,j,p,k;
    scanf("%d",&t);
    for(i=1;i<=t;++i)
        {
            scanf("%d%d%d%d%d%d%d",&C,&B,&A,&X,&Y,&Z,&N);
          /*  zi1=X;
            zi2=Y;
            zi3=Z;
            for(j=3;j<=N;++j)
                {
                    zifin=((zi3*A)%mod+(zi2*B)%mod+(zi1*C)%mod)%mod;
                    zi1=zi2;
                    zi2=zi3;
                    zi3=zifin;
                }*/
            m1[1][1]=X; m1[1][2]=Y; m1[1][3]=Z;
			m1[2][1]=1; m1[2][2]=0;	m1[2][3]=0;			
			m1[3][1]=0;	m1[3][2]=1; m1[3][3]=0;
			for(k=1;k<=3;++k)
                for(j=1;j<=3;++j)
                    m2[k][j]=(k==j)?1:0;
            p=N-2;
            while(p)
            {
                if(p%2==1)
                     mul2();
                mul1();
                p/=2;
            }
            long long rez=(long long)(((long long)((long long)m2[1][1]*(long long)A)%mod)+(long long)((long long)((long long)m2[1][2]*(long long)B)%mod)+(long long)((long long)((long long)m2[1][3]*(long long)C)%mod)%mod);
            printf("%lld\n",rez);
        }

    return 0;
}