Cod sursa(job #1883955)

Utilizator feli2felicia iuga feli2 Data 18 februarie 2017 12:41:18
Problema Iepuri Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("iepuri.in");
ofstream fout("iepuri.out");

long long M[3][3], A[3][3], r[3][3], aux[3][3];
const int MOD=666013;

void inm(long long a[3][3], long long b[3][3], long long c[3][3])
{
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<3;j++)
        {
            c[i][j]=0;
            for(int k=0;k<3;k++)
            {
                c[i][j]+=(a[i][k]*b[k][j])%MOD;
                c[i][j]=c[i][j]%MOD;
            }
        }
    }
}

void exp(long long b[3][3], int p)
{
    r[0][0]=1;
    r[1][1]=1;
    r[2][2]=1;
    for(int bit=0;(1<<bit)<=p;bit++)
    {
        if(p&(1<<bit))
        {
            inm(r,b,aux);
            for(int i=0;i<3;i++)
                for(int j=0;j<3;j++)
                    r[i][j]=aux[i][j];
        }
        inm(b,b,aux);
        for(int i=0;i<3;i++)
            for(int j=0;j<3;j++)
                b[i][j]=aux[i][j];
    }
}

int main()
{
    int t;
    fin>>t;
    for(int i=1;i<=t;i++)
    {
        int x, y, z, a, b, c, n;
        fin>>x>>y>>z>>a>>b>>c>>n;
        M[0][0]=a;
        M[1][0]=b;
        M[2][0]=c;
        M[0][1]=1;
        M[1][2]=1;
        A[0][0]=z;
        A[0][1]=y;
        A[0][2]=x;
        exp(M,n-2);
        long long R[3][3];
        inm(A,r,R);
        fout<<R[0][0]<<'\n';
        for(int i=0;i<3;i++)
            for(int j=0;j<3;j++)
                r[i][j]=0;
        for(int i=0;i<3;i++)
            for(int j=0;j<3;j++)
                M[i][j]=0;
    }
    return 0;
}