Cod sursa(job #2266831)

Utilizator adimiclaus15Miclaus Adrian Stefan adimiclaus15 Data 22 octombrie 2018 21:49:38
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <iostream>
#include <fstream>
#define MOD 666013
using namespace std;
ifstream f("iepuri.in");
ofstream g("iepuri.out");
int t,x,y,z,a,b,c,n;
long long p[3][3],r[3][3],sol[3][3];
void initializare()
{
    int i,j;
    p[0][0]=0;
    p[0][1]=0;
    p[0][2]=c;
    p[1][0]=1;
    p[1][1]=0;
    p[1][2]=b;
    p[2][0]=0;
    p[2][1]=1;
    p[2][2]=a;
    r[0][0]=x;
    r[0][1]=y;
    r[0][2]=z;
    for(i=1;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            r[i][j]=0;
        }
    }
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            if(i==j)
                sol[i][j]=1;
            else
                sol[i][j]=0;
        }
    }
}
void inmultire(long long m1[3][3],long long m2[3][3])
{
    int m3[3][3],i,j,k;
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            m3[i][j]=0;
            for(k=0;k<3;k++)
            {
                m3[i][j]=(m3[i][j]+m1[i][k]*m2[k][j])%MOD;
            }
        }
    }
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            m1[i][j]=m3[i][j];
        }
    }
}
void ridicare()
{
    while(n>0)
    {
        if(n%2==1)
        {
            inmultire(sol,p);
        }
        inmultire(p,p);
        n=n/2;
    }
}
int main()
{
    f>>t;
    while(t--)
    {
        f>>x>>y>>z>>a>>b>>c>>n;
        n=n-2;
        initializare();
        ridicare();
        inmultire(r,sol);
        g<<r[0][2]<<"\n";
    }
    return 0;
}