Cod sursa(job #1255985)

Utilizator heracleRadu Muntean heracle Data 5 noiembrie 2014 17:44:53
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <cstdio>

FILE* in=fopen("iepuri.in","r");
FILE* out=fopen("iepuri.out","w");

const int R=666013;

int mat[3][3];
int pst[3][3];
long long aux[3][3];


void inmultire(int a[3][3], int b[3][3])
{
    for(int i=0; i<3; i++)
        for(int j=0; j<3; j++)
            for(int k=0; k<3; k++)
            {
                aux[i][j]+=(long long)a[i][k]*b[k][j];
                aux[i][j]%=R;
            }

     for(int i=0; i<3; i++)
        for(int j=0; j<3; j++)
        {
            a[i][j]=aux[i][j];
            aux[i][j]=0;
        }


}

int main()
{
    int x,y,z,a,b,c,n,t;

    fscanf(in,"%d",&t);

    for(int k=1; k<=t; k++)
    {
        fscanf(in,"%d%d%d%d%d%d%d",&x,&y,&z,&a,&b,&c,&n);

        for(int i=0; i<3; i++)
            for(int j=0; j<3; j++)
            {
                mat[i][j]=0;
                pst[i][j]=0;
            }

        mat[0][0]=a;
        mat[0][1]=b;
        mat[0][2]=c;
        mat[1][0]=1;
        mat[2][1]=1;

        pst[0][0]=1;
        pst[1][1]=1;
        pst[2][2]=1;

        n-=2;

        while(n)
        {
            if(n%2==1)
            {
                inmultire(pst,mat);

            }
            n/=2;
            inmultire(mat,mat);
        }

        fprintf(out,"%d\n",((long long)pst[0][0]*z+(long long)pst[0][1]*y+(long long)pst[0][2]*x)%R);

    }
    return 0;
}