Cod sursa(job #2951358)

Utilizator staicumateiStaicu Matei Octavian staicumatei Data 6 decembrie 2022 09:28:49
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("iepuri.in");
ofstream g("iepuri.out");

const int MOD=666013;
long long rez[4][4],m[4][4];

void inmultire(long long a[4][4],long long b[4][4])
{
    long long c[4][4];
    for(int i=1; i<=3; i++)
        for(int j=1; j<=3; j++)
            c[i][j]=0;
    for(int i=1; i<=3; i++)
        for(int j=1; j<=3; j++)
        {
            for(int k=1; k<=3; k++)
                c[i][j]=(c[i][j]+(a[i][k]*b[k][j])%MOD)%MOD;
        }
    for(int i=1; i<=3; i++)
        for(int j=1; j<=3; j++)
            a[i][j]=c[i][j];
}
void putere(long long m[4][4],int exp)
{
    while(exp!=0)
    {
        if(exp%2==0)
        {
            inmultire(m,m);
            exp/=2;
        }
        else
        {
            inmultire(rez,m);
            exp--;
        }
    }
}
int main()
{
    int p,x,y,z,a,b,c,n;
    f>>p;
    for(int k=1; k<=p; k++)
    {
        f>>x>>y>>z>>a>>b>>c>>n;
        rez[1][1]=rez[2][2]=rez[3][3]=1;
        m[1][2]=m[2][3]=1;
        m[3][1]=c;
        m[3][2]=b;
        m[3][3]=a;
        putere(m,n-2);
        g<<((rez[3][1]*x)%MOD+(rez[3][2]*y)%MOD+(rez[3][3]*z)%MOD)%MOD<<'\n';
        for(int i=1; i<=3; i++)
            for(int j=1; j<=3; j++)
                rez[i][j]=m[i][j]=0;
    }
    return 0;
}