Cod sursa(job #3339006)

Utilizator parus_majorParus Major parus_major Data 5 februarie 2026 18:03:31
Problema Iepuri Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <climits>

using namespace std;

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

const int MOD = 666013;

int T, A, B, C, X, Y, Z, N;

class Matrix {
public:
    Matrix(int x0, int x1, int x2, int y0, int y1, int y2, int z0, int z1, int z2) : data_(
        { vector<int>({x0, x1, x2}), vector<int>({y0, y1, y2}), vector<int>({z0, z1, z2}) }) {
    };

    Matrix operator*(Matrix const& other) {
        Matrix result(0, 0, 0, 0, 0, 0, 0, 0, 0);
        for (int i = 0; i < 3; ++i) {
            for (int j = 0; j < 3; ++j) {
                for (int t = 0; t < 3; ++t) {
                    result.data_[i][j] += static_cast<long long>(data_[i][t]) * other.data_[t][j] % MOD;
                }
                result.data_[i][j] %= MOD;
            }
        }
        return result;
    }

    int Get(int x, int y) {
        return data_[x][y];
    }

private:
    vector<vector<int>> data_;
};

int main()
{
    fin >> T;
    while (T--) {
        fin >> X >> Y >> Z >> C >> B >> A >> N;

        Matrix base(0, 0, A, 1, 0, B, 0, 1, C);
        Matrix result(X, Y, Z, 0, 0, 0, 0, 0, 0);

        const int power = N - 2;
        for (int i = 0; (1 << i) <= power; ++i) {
            if (power & (1 << i)) {
                result = result * base;
            }
            base = base * base;
        }
        fout << result.Get(0, 2) << '\n';
    }

    return 0;
}