Cod sursa(job #2664700)

Utilizator RaresPoinaruPoinaru-Rares-Aurel RaresPoinaru Data 29 octombrie 2020 10:18:28
Problema Iepuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.8 kb
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin ("iepuri.in");
ofstream fout ("iepuri.out");
const int MOD=666013;
int a[4][4],r[4][4],r2[4][4],b[4][4];
void Inmultire2 ()
{
    r2[1][1]=(1LL*r[1][1]*a[1][1]+1LL*r[1][2]*a[2][1]+1LL*r[1][3]*a[3][1])%MOD;
    r2[1][2]=(1LL*r[1][1]*a[1][2]+1LL*r[1][2]*a[2][2]+1LL*r[1][3]*a[3][2])%MOD;
    r2[1][3]=(1LL*r[1][1]*a[1][3]+1LL*r[1][2]*a[2][3]+1LL*r[1][3]*a[3][3])%MOD;
    r2[2][1]=(1LL*r[2][1]*a[1][1]+1LL*r[2][2]*a[2][1]+1LL*r[2][3]*a[3][1])%MOD;
    r2[2][2]=(1LL*r[2][1]*a[1][2]+1LL*r[2][2]*a[2][2]+1LL*r[2][3]*a[3][2])%MOD;
    r2[2][3]=(1LL*r[2][1]*a[1][3]+1LL*r[2][2]*a[2][3]+1LL*r[2][3]*a[3][3])%MOD;
    r2[3][1]=(1LL*r[3][1]*a[1][1]+1LL*r[3][2]*a[2][1]+1LL*r[3][3]*a[3][1])%MOD;
    r2[3][2]=(1LL*r[3][1]*a[1][2]+1LL*r[3][2]*a[2][2]+1LL*r[3][3]*a[3][2])%MOD;
    r2[3][3]=(1LL*r[3][1]*a[1][3]+1LL*r[3][2]*a[2][3]+1LL*r[3][3]*a[3][3])%MOD;
    r[1][1]=r2[1][1];
    r[1][2]=r2[1][2];
    r[1][3]=r2[1][3];
    r[2][1]=r2[2][1];
    r[2][2]=r2[2][2];
    r[2][3]=r2[2][3];
    r[3][1]=r2[3][1];
    r[3][2]=r2[3][2];
    r[3][3]=r2[3][3];
}
void Inmultire ()
{
    b[1][1]=a[1][1];
    b[1][2]=a[1][2];
    b[1][3]=a[1][3];
    b[2][1]=a[2][1];
    b[2][2]=a[2][2];
    b[2][3]=a[2][3];
    b[3][1]=a[3][1];
    b[3][2]=a[3][2];
    b[3][3]=a[3][3];
    a[1][1]=(1LL*b[1][1]*b[1][1]+1LL*b[1][2]*b[2][1]+1LL*b[1][3]*b[3][1])%MOD;
    a[1][2]=(1LL*b[1][1]*b[1][2]+1LL*b[1][2]*b[2][2]+1LL*b[1][3]*b[3][2])%MOD;
    a[1][3]=(1LL*b[1][1]*b[1][3]+1LL*b[1][2]*b[2][3]+1LL*b[1][3]*b[3][3])%MOD;
    a[2][1]=(1LL*b[2][1]*b[1][1]+1LL*b[2][2]*b[2][1]+1LL*b[2][3]*b[3][1])%MOD;
    a[2][2]=(1LL*b[2][1]*b[1][2]+1LL*b[2][2]*b[2][2]+1LL*b[2][3]*b[3][2])%MOD;
    a[2][3]=(1LL*b[2][1]*b[1][3]+1LL*b[2][2]*b[2][3]+1LL*b[2][3]*b[3][3])%MOD;
    a[3][1]=(1LL*b[3][1]*b[1][1]+1LL*b[3][2]*b[2][1]+1LL*b[3][3]*b[3][1])%MOD;
    a[3][2]=(1LL*b[3][1]*b[1][2]+1LL*b[3][2]*b[2][2]+1LL*b[3][3]*b[3][2])%MOD;
    a[3][3]=(1LL*b[3][1]*b[1][3]+1LL*b[3][2]*b[2][3]+1LL*b[3][3]*b[3][3])%MOD;
}
void Ridicarelaputere (int k)
{
    r[1][1]=1;
    r[1][3]=0;
    r[1][2]=0;
    r[2][1]=0;
    r[2][2]=1;
    r[2][3]=0;
    r[3][3]=1;
    r[3][2]=0;
    r[3][1]=0;
    while (k)
    {
        if (k%2==1)
        {
            Inmultire2 ();
        }
        Inmultire ();
        k=k/2;
    }
}
int main()
{
    int n,x,y,z,A,B,C,k;
    fin >>n;
    while (n>0)
    {
        fin >>x>>y>>z>>A>>B>>C>>k;
        a[1][1]=0;
        a[1][2]=0;
        a[2][2]=0;
        a[3][1]=0;
        a[1][3]=C;
        a[2][1]=1;
        a[2][3]=B;
        a[3][2]=1;
        a[3][3]=A;
        Ridicarelaputere (k-2);
        fout <<x*r[1][3]+y*r[2][3]+z*r[3][3]<<'\n';
        n--;
    }
    fin.close ();
    fout.close ();
    return 0;
}