Cod sursa(job #2136747)

Utilizator cezinatorCezar D cezinator Data 20 februarie 2018 10:31:13
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <fstream>

using namespace std;
ifstream fin("iepuri.in");
ofstream fout("iepuri.out");
const int mod=666013;
typedef unsigned long long mat[3][3];
unsigned long long T,X,Y,Z,A,B,C,N;
mat a,b;
void construieste(mat a)
{
      a[0][0]=a[0][1]=a[1][1]=a[2][0]=0;
        a[1][0]=a[2][1]=1;
        a[0][2]=C;
        a[1][2]=B;
        a[2][2]=A;
}
void inmultire(mat a, mat b, mat c)
{
    mat aux;
    for(int i=0;i<=2;i++)
        for(int j=0;j<=2;j++)
        {
            aux[i][j]=0;
            for(int k=0;k<=2;k++)
            {
                aux[i][j]+=a[i][k]*b[k][j]%mod;
            }
        }
        for(int i=0;i<=2;i++)
        {
            for(int j=0;j<=2;j++)
            c[i][j]=aux[i][j];
        }
}
void a_la_n(mat a,mat b, int n)
{
    if(n==1)
    {
        b[0][0]=b[0][1]=b[1][1]=b[2][0]=0;
        b[1][0]=b[2][1]=1;
        b[0][2]=C;
        b[1][2]=B;
        b[2][2]=A;
    }
    else if(n==0)
    {
        b[0][0]=b[1][1]=b[2][2]=1;
        b[0][1]=b[0][2]=b[1][0]=b[1][2]=b[2][0]=b[2][1]=0;
    }
    else
        {
            mat c;
            a_la_n(a,c,n/2);
            if(n%2==0) inmultire(c,c,b);
            else
            {
                inmultire(c,c,b);
                inmultire(b,a,b);
            }
        }
}
int main()
{
    fin>>T;
    for(int i=1;i<=T;i++)
    {
        fin>>X>>Y>>Z>>A>>B>>C>>N;
        construieste(a);
        a_la_n(a,b,N-2);
        fout<<(X*b[0][2]%mod+Y*b[1][2]%mod+Z*b[2][2]%mod)%mod<<'\n';
    }
    return 0;
}