Cod sursa(job #1999107)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 10 iulie 2017 12:40:11
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <bits/stdc++.h>

#define MaxN 200005
#define INF 2140000000
#define eps 1e-9
#define MOD 666013
#define pi 3.1415926535897932384626433832795

using namespace std;

FILE *IN,*OUT;

int T,N,X,Y,Z,A,B,C;

struct Matrix
{
    int L,W,mat[3][3];
    void Clear()
    {
        for(int i=0;i<L;i++)
            for(int j=0;j<W;j++)
                mat[i][j]=0;
    }
    void Set_Size(int x,int y)
    {
        L=x;
        W=y;
    }
    void Identity()
    {
        this->Clear();
        for(int i=0;i<L;i++)
            mat[i][i]=1;
    }
    void Multiply(Matrix A)
    {
        Matrix aux;
        aux.Set_Size(L,A.W);
        aux.Clear();
        for(int i=0;i<L;i++)
            for(int j=0;j<A.W;j++)
                for(int k=0;k<L;k++)
                    aux.mat[i][j]=(aux.mat[i][j]+1LL*mat[i][k]*A.mat[k][j])%MOD;
        *this=aux;
    }
    void LgPow(int exp)
    {
        Matrix ans,base;
        base=*this;
        ans.Set_Size(L,W);
        ans.Identity();
        for(int i=0;i<31;i++)
        {
            if((1<<i)&exp)
                ans.Multiply(base);
            base.Multiply(base);
        }
        *this=ans;
    }
}Alfa,Beta;

int main()
{
    IN=fopen("iepuri.in","r");
    OUT=fopen("iepuri.out","w");

    fscanf(IN,"%d",&T);
    Alfa.Set_Size(3,3);
    Beta.Set_Size(3,1);
    for(int t=1;t<=T;t++)
    {
        fscanf(IN,"%d%d%d%d%d%d%d",&X,&Y,&Z,&A,&B,&C,&N);
        Alfa.Set_Size(3,3);
        Alfa.Clear();
        Beta.Clear();
        Beta.mat[0][0]=X;
        Beta.mat[1][0]=Y;
        Beta.mat[2][0]=Z;
        Alfa.mat[0][1]=Alfa.mat[1][2]=1;
        Alfa.mat[2][0]=C;
        Alfa.mat[2][1]=B;
        Alfa.mat[2][2]=A;
        Alfa.LgPow(N);
        Alfa.Multiply(Beta);
        fprintf(OUT,"%d\n",Alfa.mat[0][0]);
    }
    return 0;
}