Cod sursa(job #3169806)

Utilizator Mihai_999Diaconeasa Mihai Mihai_999 Data 16 noiembrie 2023 01:09:00
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <iostream>
#include <fstream>
#define nl '\n'

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

const int MOD = 666013;
long long int mat[2][4][4], aux[4][4]; /// mat[1] = matricea rezultanta, mat[0] = baza la fiecare pas
long long int X, Y, Z, A, B, C, N;
long long int ans;

void multip(int x, int y)
{
    for (int i = 1; i <= 3; i++)
    {
        for (int j = 1; j <= 3; j++)
        {
            for (int k = 1; k <= 3; k++)
            {
                aux[i][j]+=mat[x][i][k]*mat[y][k][j];
                aux[i][j]%=MOD;
            }
        }
    }
    for (int i = 1; i <= 3; i++)
    {
        for (int j = 1; j <= 3; j++)
        {
            mat[x][i][j] = aux[i][j];
            aux[i][j] = 0;
        }
    }
    return;
}
void binexp(long long int pow)
{
    while (pow)
    {
        if (pow&1)
            multip(1, 0);
        multip(0, 0);
        pow>>=1;
    }
    return;
}
void solve()
{
    ans = 0;
    fin >> X >> Y >> Z >> A >> B >> C >> N;
    mat[0][1][1] = A;
    mat[0][1][2] = B;
    mat[0][1][3] = C;
    mat[0][2][1] = mat[0][3][2] = 1;
    mat[0][2][2] = mat[0][2][3] = mat[0][3][1] = mat[0][3][3] = 0;
    for (int i = 1; i <= 3; i++)
        for (int j = 1; j <= 3; j++)
            mat[1][i][j] = 0;
    mat[1][1][1] = mat[1][2][2] = mat[1][3][3] = 1;
    binexp(N-2);
    ans+=mat[1][1][1]*Z+mat[1][1][2]*Y+mat[1][1][3]*X;
    ans%=MOD;
    fout << ans << nl;
    return;
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t;
    fin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}