Cod sursa(job #2174239)

Utilizator delia_99Delia Draghici delia_99 Data 16 martie 2018 11:20:40
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <cstdio>
#include <cstring>
#define MOD 666013

using namespace std;

int q,t[4],a,b,c,n;
int M[5][5],R[5][5],aux[5][5],D[5][2];

void init()
{
    memset(M,0,sizeof(M));
    memset(R,0,sizeof(R));
    M[1][2]=1;
    M[2][3]=1;
    M[3][1]=c;
    M[3][2]=b;
    M[3][3]=a;

    D[1][1]=t[0];
    D[2][1]=t[1];
    D[3][1]=t[2];

    R[1][1]=1;
    R[2][2]=1;
    R[3][3]=1;
}

void inm(int A[5][5],int B[5][5],int C[5][5],int k1,int k2)
{
    for(int i=1; i<=3; ++i)
        for(int j=1; j<=3; ++j)
            C[i][j]=0;

    for(int i=1; i<=k1; ++i)
        for(int j=1; j<=k2; ++j)
            for(int k=1; k<=3; ++k)
            {
                C[i][j]+=(1LL*A[i][k]*B[k][j])%MOD;
                if(C[i][j]>=MOD)
                    C[i][j]-=MOD;
            }
}

void putere(int n)
{
    int bit;
    for(bit=0; bit<=30; ++bit)
    {
        if((n>>bit)&1)
        {
            inm(M,R,aux,3,3);
            memcpy(R,aux,sizeof(aux));
        }
        inm(M,M,aux,3,3);
        memcpy(M,aux,sizeof(aux));
    }
}

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

    scanf("%d",&q);
    while(q--)
    {
        scanf("%d%d%d%d%d%d%d",&t[0],&t[1],&t[2],&a,&b,&c,&n);

        init();

        if(n<=2)
            printf("%d\n",t[n]);
        else
        {
            putere(n-2);
            inm(R,D,aux,3,1);
        }
        printf("%d\n",aux[3][1]);
    }
    return 0;
}