Cod sursa(job #1152333)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 24 martie 2014 17:39:33
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <cstdio>
#define MOD 666013

using namespace std;

inline void MultMat(int a[][5], int b[][5])
{
    int c[5][5],i,j,k,s;
    for(i=1;i<=3;++i)
        for(j=1;j<=3;++j)
        {
            s=0;
            for(k=1;k<=3;++k)
                s=(s+1LL*a[i][k]*b[k][j])%MOD;
            c[i][j]=s;
        }
    for(i=1;i<=3;++i)
        for(j=1;j<=3;++j)
            a[i][j]=c[i][j];
}

inline void Pow_Log(int a[][5], int p)
{
    int put[5][5],i,j;
    for(i=1;i<=3;++i)
        for(j=1;j<=3;++j)
            if(i==j)
                put[i][j]=1;
            else
                put[i][j]=0;
    while(p)
    {
        if(p%2)
        {
            --p;
            MultMat(put,a);
        }
        p/=2;
        MultMat(a,a);
    }
    for(i=1;i<=3;++i)
        for(j=1;j<=3;++j)
            a[i][j]=put[i][j];
}

int main()
{
    int T,x,y,z,A,B,C,N,a[5][5],b[5][5];
    freopen ("iepuri.in","r",stdin);
    freopen ("iepuri.out","w",stdout);
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d%d%d%d%d%d%d", &x,&y,&z,&A,&B,&C,&N);
        a[1][1]=a[1][2]=0; a[1][3]=C;
        a[2][1]=1; a[2][2]=0; a[2][3]=B;
        a[3][1]=0; a[3][2]=1; a[3][3]=A;
        Pow_Log(a,N-2);
        b[1][1]=x; b[1][2]=y; b[1][3]=z;
        b[2][1]=b[2][2]=b[2][3]=0;
        b[3][1]=b[3][2]=b[3][3]=0;
        MultMat(b,a);
        printf("%d\n", b[1][3]);
    }
    return 0;
}