Cod sursa(job #1515291)

Utilizator elevenstrArina Raileanu elevenstr Data 1 noiembrie 2015 13:34:21
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <iostream>
#include <fstream>
using namespace std;
#define MOD 666013
ifstream in ("iepuri.in");
ofstream out("iepuri.out");
int mat[4][4],aux[4][4],sp[4][4],ans[4][4];
inline void mult(int m1[4][4],int m2[4][4], int aux[4][4])
{
    for (int i=1;i<=3;i++)
        for(int j=1;j<=3;j++)
    {   aux[i][j]=0;
        for (int k=1;k<=3;k++)
            aux[i][j]=(aux[i][j]+1LL*m1[i][k]*m2[k][j])%MOD;
    }

}
inline void exp(int mat[4][4],int put,int a,int b,int c)
{   int z[4][4];
    z[2][1]=z[3][2]=1;
    z[2][2]=z[2][3]=z[3][1]=z[3][3]=0;
    z[1][1]=a;
    z[1][2]=b;
    z[1][3]=c;
    for(int i=1;i<=3;i++)
        for(int j=1;j<=3;j++)
        aux[i][j]=0;
    if(put<=1)return;
    exp(mat,put/2,a,b,c);
    mult(mat,mat,aux);
    for(int i=1;i<=3;i++)
        for(int j=1;j<=3;j++)
        mat[i][j]=aux[i][j];
    if(put%2)
    mult(mat,z,aux);
     for(int i=1;i<=3;i++)
        for(int j=1;j<=3;j++)
        mat[i][j]=aux[i][j];
}
int main()
{  int t;
    int x,y,z,a,b,c,n,i,j,k,lb;
    in>>t;

    for(lb=1;lb<=t;lb++)
    {
        in>>x>>y>>z>>a>>b>>c>>n;
        mat[2][1]=mat[3][2]=1;
        mat[2][2]=mat[2][3]=mat[3][1]=mat[3][3]=0;
        mat[1][1]=a;
        mat[1][2]=b;
        mat[1][3]=c;
        exp(mat,n-1,a,b,c);
        sp[1][1]=z;
        sp[2][1]=y;
        sp[3][1]=x;
        for(i=1;i<=3;i++)
        {
            ans[i][1]=0;
            for(k=1;k<=3;k++)
                ans[i][1]=(ans[i][1]+1LL*mat[i][k]*sp[k][1])%MOD;
        }
         out<<ans[2][1];
            out<<'\n';
        }


    return 0;
}