Cod sursa(job #2750574)

Utilizator EckchartZgarcea Robert-Andrei Eckchart Data 12 mai 2021 00:07:44
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.25 kb
#include "bits/stdc++.h"
#include <cassert>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
using pi = pair<int, int>;
using pll = pair<ll, ll>;
using pd = pair<double, double>;
using pld = pair<ld, ld>;
const int M = 666013;


int main()
{
    ifstream cin("iepuri.in");
    ofstream cout("iepuri.out");

    int T;
    cin >> T;

    auto mod = [](const ll a) -> ll
    {
        return a % M;
    };

    auto matrix_mult = [&](const vector<vector<ll>> &mat1, const vector<vector<ll>> &mat2) -> vector<vector<ll>>
    {
        const int nr_lines1 = mat1.size(), nr_cols1 = mat1.front().size(),
                  nr_lines2 = mat2.size(), nr_cols2 = mat2.front().size();
        vector<vector<ll>> res_mat(nr_lines1, vector<ll>(nr_cols2));
        for (int i = 0; i < nr_lines1; ++i)
        {
            for (int j = 0; j < nr_cols2; ++j)
            {
                for (int k = 0; k < nr_cols1; ++k)
                {
                    res_mat[i][j] = mod(res_mat[i][j] + mod(mat1[i][k] * mat2[k][j]));
                }
            }
        }
        return res_mat;
    };

    auto fast_exp = [&](vector<vector<ll>> mat, int exp) -> vector<vector<ll>>
    {
        const int res_nr_lines = mat.size(), res_nr_cols = mat.front().size();
            /* assert(res_nr_lines == res_nr_cols); */
        vector<vector<ll>> res(res_nr_lines, vector<ll>(res_nr_cols));
        for (int i = 0; i < res_nr_lines; ++i)
        {
            res[i][i] = 1;
        }
        while (exp)
        {
            if (exp & 1)
            {
                res = move(matrix_mult(res, mat));
            }
            mat = move(matrix_mult(mat, mat));
            exp >>= 1;
        }
        return res;
    };

    while (T--)
    {
        static int X, Y, Z, A, B, C, N;
        cin >> X >> Y >> Z >> A >> B >> C >> N;

        vector<vector<ll>> rec_mat{{A, B, C},
                                   {1, 0, 0},
                                   {0, 1, 0}};
        rec_mat = move(fast_exp(rec_mat, N - 2));
        vector<vector<ll>> res_mat{{Z}, {Y}, {X}};
        res_mat = move(matrix_mult(rec_mat, res_mat));

        cout << res_mat.front().front() << "\n";
    }
}