Cod sursa(job #2019372)

Utilizator VladG26Ene Vlad-Mihai VladG26 Data 7 septembrie 2017 17:01:34
Problema Iepuri Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <iostream>
#include <cstdio>
#define MOD 666013
using namespace std;
int t,n,x,y,z,a,b,c;
    int h[3][3];
void inmultireMatrice(int m1[3][3],int m2[3][3],int rez[3][3])
{
    rez[0][0]=(1LL*m1[0][0]*m2[0][0])%MOD+(1LL*m1[0][1]*m2[1][0])%MOD+(1LL*m1[0][2]*m2[2][0])%MOD;
    rez[0][1]=(1LL*m1[0][0]*m2[0][1])%MOD+(1LL*m1[0][1]*m2[1][1])%MOD+(1LL*m1[0][2]*m2[2][1])%MOD;
    rez[0][2]=(1LL*m1[0][0]*m2[0][2])%MOD+(1LL*m1[0][1]*m2[1][2])%MOD+(1LL*m1[0][2]*m2[2][2])%MOD;

    rez[1][0]=(1LL*m1[1][0]*m2[0][0])%MOD+(1LL*m1[1][1]*m2[1][0])%MOD+(1LL*m1[1][2]*m2[2][0])%MOD;
    rez[1][1]=(1LL*m1[1][0]*m2[0][1])%MOD+(1LL*m1[1][1]*m2[1][1])%MOD+(1LL*m1[1][2]*m2[2][1])%MOD;
    rez[1][2]=(1LL*m1[1][0]*m2[0][2])%MOD+(1LL*m1[1][1]*m2[1][2])%MOD+(1LL*m1[1][2]*m2[2][2])%MOD;

    rez[2][0]=(1LL*m1[2][0]*m2[0][0])%MOD+(1LL*m1[2][1]*m2[1][0])%MOD+(1LL*m1[2][2]*m2[2][0])%MOD;
    rez[2][1]=(1LL*m1[2][0]*m2[0][1])%MOD+(1LL*m1[2][1]*m2[1][1])%MOD+(1LL*m1[2][2]*m2[2][1])%MOD;
    rez[2][2]=(1LL*m1[2][0]*m2[0][2])%MOD+(1LL*m1[2][1]*m2[1][2])%MOD+(1LL*m1[2][2]*m2[2][2])%MOD;
}
void cpy(int m1[3][3],int m2[3][3])
{
    for(int i=0; i<3; i++)
        for(int ii=0; ii<3; ii++)
            m1[i][ii]=m2[i][ii];
}
void putere(int m[3][3],int p)
{
    int rez[3][3]={{1,0,0},{0,1,0},{0,0,1}},aux[3][3];
    while(p)
    {
        if(p%2)
        {
            inmultireMatrice(rez,m,aux);
            cpy(rez,aux);
            p--;
        }
        inmultireMatrice(m,m,aux);
        cpy(m,aux);
        p/=2;
    }
    printf("%d\n",(x*rez[0][2]%MOD+y*rez[1][2]%MOD+z*rez[2][2]%MOD)%MOD);
}
void init(int a,int b,int c,int m[3][3])
{
    m[0][0]=0;
    m[0][1]=0;
    m[0][2]=c;
    m[1][0]=1;
    m[1][1]=0;
    m[1][2]=b;
    m[2][0]=0;
    m[2][1]=1;
    m[2][2]=a;
}
int main()
{
    freopen("iepuri.in","r",stdin);
    freopen("iepuri.out","w",stdout);

    scanf("%d",&t);
    for(int i=0; i<t; i++)
    {
        scanf("%d%d%d%d%d%d%d",&x,&y,&z,&a,&b,&c,&n);
        init(a,b,c,h);
        putere(h,n-2);
    }
    return 0;
}