Cod sursa(job #560288)

Utilizator acelasi7Tudor Maxim acelasi7 Data 18 martie 2011 13:40:32
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include<cstdio>
#include<fstream>
using namespace std;
#define mod 666013

long long M[3][3],I[3],M_N[3][3],AA[3][3];

void inmulteste()
{
    int i,j,k;
    long long s;
    for(i=0;i<3;++i)
    for(j=0;j<3;++j)
    {
        s=0;
        for(k=0;k<3;++k)
            {s+=AA[i][k]*AA[k][j]; s%=mod;}
        M_N[i][j]=s;
    }
    for(i=0;i<3;++i)
    for(j=0;j<3;++j)
        AA[i][j]=M_N[i][j];

}
void inmulteste2()
{
    int i,j,k;
    long long s;
    for(i=0;i<3;++i)
    for(j=0;j<3;++j)
    {
        s=0;
        for(k=0;k<3;++k)
            {s+=AA[i][k]*M[k][j]; s%=mod;}
        M_N[i][j]=s;
    }
    for(i=0;i<3;++i)
    for(j=0;j<3;++j)
        AA[i][j]=M_N[i][j];

}
void fct(int p)
{
    if(p<=1)
        return ;
    fct(p/2);
    inmulteste();
    if(p&1)
        inmulteste2();
}
int main()
{
    int N,X,Y,Z,A,B,C,T;
    int i,j,k;
    long long sol;

    ifstream in("iepuri.in");
    ofstream out("iepuri.out");
    in>>T;
    M[0][1]=1, M[1][2]=1;
    for(k=1;k<=T;++k)
    {
        in>>X>>Y>>Z>>A>>B>>C>>N;
        M[2][0]=C; M[2][1]=B; M[2][2]=A;
        I[0]=X; I[1]=Y; I[2]=Z;
        N-=2;
        for(i=0;i<3;++i)
            for(j=0;j<3;++j)
                AA[i][j]=M[i][j];
        fct(N);
        sol=0;
        for(i=0;i<3;++i)
        {
            sol+=M_N[2][i]*I[i];sol%=mod;}
        out<<sol<<'\n';
    }
    return 0;
}