Cod sursa(job #2139690)

Utilizator george.ursachiUrsachi George george.ursachi Data 22 februarie 2018 18:37:28
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <fstream>

using namespace std;

ifstream f("iepuri.in");
ofstream g("iepuri.out");
typedef unsigned long long mat[3][3];
const int mod=666013;
unsigned long long T,x,y,z,A,B,C,nr;
int N;
int i,j,k;
mat a,b;
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 Alan(mat a, mat b, int n)
{
    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 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
    {
        mat c;
        Alan(a,c,n/2);
        if(n%2==0)
        {
            inmultire(c,c,b);
        }
        else
        {
            inmultire(c,c,b);
            inmultire(b,a,b);
        }
    }
}


int main()
{
    //citire
    f>>T;
    for(i=1;i<=T;i++)
    {
        f>>x>>y>>z>>A>>B>>C>>N;
        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;

        Alan(a,b,N-2);

        nr=(x*b[0][2]%mod+y*b[1][2]%mod+z*b[2][2]%mod)%mod;
        g<<nr<<'\n';
    }

    f.close();
    g.close();

    return 0;
}