Cod sursa(job #2637777)

Utilizator loraclorac lorac lorac Data 24 iulie 2020 19:45:34
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("iepuri.in");
ofstream out("iepuri.out");
typedef long long ll;
const ll mod=666013;
ll rez[5][5],m[5][5];
ll cc[5][5],f[5][5];
void rez_m()
{
    for(ll i=1;i<=3;++i)
    for(ll j=1;j<=3;++j)
        cc[i][j]=0;
    for(ll k=1;k<=3;++k)
    for(ll i=1;i<=3;++i)
    for(ll j=1;j<=3;++j)
        cc[i][j]=(cc[i][j]+m[i][k]*rez[k][j])%mod;
    for(ll i=1;i<=3;++i)
    for(ll j=1;j<=3;++j)
        rez[i][j]=cc[i][j];
}
void m_m()
{
    for(ll i=1;i<=3;++i)
    for(ll j=1;j<=3;++j)
        cc[i][j]=0;
    for(ll k=1;k<=3;++k)
    for(ll i=1;i<=3;++i)
    for(ll j=1;j<=3;++j)
        cc[i][j]=(cc[i][j]+m[i][k]*m[k][j])%mod;
    for(ll i=1;i<=3;++i)
    for(ll j=1;j<=3;++j)
        m[i][j]=cc[i][j];
}
int main()
{
    ll tst,x,y,z,a,b,c,n;
    in>>tst;
    while(tst--)
    {
        in>>x>>y>>z>>a>>b>>c>>n;
        if(n==0) {out<<x<<'\n';continue;}
        if(n==1) {out<<x<<'\n';continue;}
        if(n==2) {out<<x<<'\n';continue;}
        for(ll i=1;i<=3;++i)
        for(ll j=1;j<=3;++j)
            rez[i][j]=cc[i][j]=m[i][j]=f[i][j]=0;
        rez[1][1]=rez[2][2]=rez[3][3]=1;
        m[1][3]=c; m[2][1]=1; m[2][3]=b;
        m[3][2]=1; m[3][3]=a;
        n-=2;
        while(n)
        {
            if(n&1) rez_m();
            m_m();
            n>>=1;
        }
        f[1][1]=x; f[1][2]=y; f[1][3]=z;
        cc[1][1]=cc[1][2]=cc[1][3]=0;
        for(ll k=1;k<=3;++k)
        for(ll j=1;j<=3;++j)
            cc[1][j]=(cc[1][j]+f[1][k]*rez[k][j])%mod;
        out<<cc[1][3]<<'\n';
    }
    return 0;
}