Cod sursa(job #3164673)

Utilizator mirceamaierean41Mircea Maierean mirceamaierean41 Data 4 noiembrie 2023 00:49:02
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream>
#include <string.h>
using namespace std;

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

const int MOD = 666013;

int p[4][4], q[4][4], r[4][4];
int x, y, z, a, b, c, n, t;

inline void expMat(int a[][4], int b[][4], int c[][4])
{
    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] + 1LL * a[i][k] * b[k][j]) % MOD;
}

inline void moveMat(int a[][4], int b[][4])
{
    for (int i = 1; i <= 3; ++i)
        for (int j = 1; j <= 3; ++j)
            a[i][j] = b[i][j];
}

void exp_mat()
{
    memset(p, 0, sizeof p);
    memset(q, 0, sizeof q);
    memset(r, 0, sizeof r);

    p[2][1] = p[3][2] = 1;
    p[1][3] = c;
    p[2][3] = b;
    p[3][3] = a;

    q[1][1] = q[2][2] = q[3][3] = 1;

    n -= 2;

    while (n)
    {
        if (n & 1)
        {
            memset(r, 0, sizeof(r));
            expMat(q, p, r);
            moveMat(q, r);
        }

        memset(r, 0, sizeof(r));
        expMat(p, p, r);
        moveMat(p, r);
        n >>= 1;
    }
    int val = (1LL * x * q[1][3] + 1LL * y * q[2][3] + 1LL * z * q[3][3]) % MOD;
    fout << val << "\n";
}

int main()
{
    fin >> t;
    while (t--)
    {
        fin >> x >> y >> z >> a >> b >> c >> n;
        exp_mat();
    }
    fout.close();
    return 0;
}