Cod sursa(job #1667239)

Utilizator SilviuIIon Silviu SilviuI Data 28 martie 2016 19:38:45
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <stdio.h>
#include <cstring>
#define mod 666013

using namespace std;

int x,y,z,a,b,c,n,m;
int sol[3][3],xx[3][3];

void inv1(int a[3][3],int b[3][3])
{
    int c[3][3]={0};

    for (int i=0;i<=2;i++)
        for (int j=0;j<=2;j++)
            for (int k=0;k<=2;k++)
                c[i][j]=(c[i][j]+1LL*a[i][k]*b[k][j])%mod;

    for (int i=0;i<=2;i++)
        for (int j=0;j<=2;j++)
            sol[i][j]=c[i][j];

}

void inv2(int a[3][3],int b[3][3])
{
    int c[3][3]={0};

    for (int i=0;i<=2;i++)
        for (int j=0;j<=2;j++)
            for (int k=0;k<=2;k++)
                c[i][j]=(c[i][j]+1LL*a[i][k]*b[k][j])%mod;

    for (int i=0;i<=2;i++)
        for (int j=0;j<=2;j++)
            xx[i][j]=c[i][j];

}

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

    scanf("%d",&m);

    for (int o=1;o<=m;o++) {

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

        memset(sol,0,sizeof(sol));
        memset(xx,0,sizeof(xx));

        if (n==0) { printf("%d\n",x); continue; }
        if (n==1) { printf("%d\n",y); continue; }
        if (n==2) { printf("%d\n",z); continue; }

        n=n-3;

        sol[1][0]=sol[2][1]=1; sol[0][2]=c; sol[1][2]=b; sol[2][2]=a;
        xx[1][0]=xx[2][1]=1; xx[0][2]=c; xx[1][2]=b; xx[2][2]=a;

        while (n>0) {
            if (n%2==1) inv1(sol,xx);
            inv2(xx,xx); n=n/2;
        }

        printf("%d\n",((1LL*sol[0][2]*x)%mod+(1LL*sol[1][2]*y)%mod+(1LL*sol[2][2]*z)%mod)%mod);

    }

    return 0;
}