Cod sursa(job #2871691)

Utilizator the4Designerthe4Designer the4Designer Data 15 martie 2022 15:16:51
Problema Iepuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <bits/stdc++.h>
using namespace std;

vector<vector<int>> multiply_matrix(vector<vector<int>> a, vector<vector<int>> b, int mod) {
    if (a.size() < 1 || a[0].size() != b.size()) {
        exit(-1);
    }

    vector<vector<int>> result(a.size(), vector<int>(b[0].size(), 0));

    // lungimea unei linii din prima matrice,
    // egala cu lungimea unei coloane din a doua matrice
    int vector_size = a[0].size();

    for (int i = 0; i < a.size(); ++i) {
        for (int j = 0; j < b[0].size(); ++j) {
            for (int k = 0; k < vector_size; ++k) {
                result[i][j] = (1LL * result[i][j] + a[i][k] * b[k][j] % mod) % mod;
            }
        }
    }

    return result;
}

vector<vector<int>> fast_matrix_pow(vector<vector<int>> base_matrix, int exponent, int mod) {
    if (exponent == 0) {
        vector<vector<int>> result(base_matrix.size(), vector<int>(base_matrix.size(), 0));

        for (int i = 0; i < base_matrix.size(); ++i) {
            result[i][i] = 1;
        }

        return result;
    }

    vector<vector<int>> result = fast_matrix_pow(base_matrix, exponent / 2, mod);

    if (exponent % 2 == 0) {
        return multiply_matrix(result, result, mod);
    }

    return multiply_matrix(base_matrix, fast_matrix_pow(base_matrix, exponent - 1, mod), mod);
}

int main(void) {
    freopen("iepuri.in","r",stdin);
	freopen("iepuri.out","w",stdout);

    int t;
    cin >> t;

    for (int i = 0; i < t; ++i) {
        int x, y, z;
        cin >> x >> y >> z;

        int a, b, c, n;
        cin >> a >> b >> c >> n;

        // d day: a*(iepuri[d-1]) + b*(iepuri[d-2])
        //                        + c*(iepuri[d-3])

        // [a b c      *    [iepuri_(d-1)   =    [iepuri_d
        //  1 0 0            iepuri_(d-2)         iepuri_(d-1)
        //  0 1 0]           iepuri_(d-3)]        iepuri_(d-2)]

        int mod = 666013;

        vector<vector<int>> matrix = {{a, b, c}, {1, 0, 0}, {0, 1, 0}};
        cout << multiply_matrix(fast_matrix_pow(matrix, (n-2), mod), {{z}, {y}, {x}}, mod)[0][0] << '\n';
    }

    return 0;
}