Cod sursa(job #2871715)

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

void multiply_matrix_3x3(int a[3][3], int b[3][3], int mod, int result[3][3]) {
    for (int i = 0; i < 3; ++i) {
        for (int j = 0; j < 3; ++j) {
            result[i][j] = 0;
        }
    }

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

void fast_matrix_pow_3x3(int base_matrix[3][3], int exponent, int mod, int result[3][3]) {
    if (exponent == 0) {
        for (int i = 0; i < 3; ++i) {
            for (int j = 0; j < 3; ++j) {
                if (i == j) {
                    result[i][j] = 1;
                } else {
                    result[i][j] = 0;
                }
            }
        }

        return;
    }

    int result2[3][3] = {0};
    fast_matrix_pow_3x3(base_matrix, exponent / 2, mod, result2);

    if (exponent % 2 == 0) {
        multiply_matrix_3x3(result2, result2, mod, result);
    } else {
        multiply_matrix_3x3(result2, result2, mod, result);

        int result_copy[3][3];
        for (int i = 0; i < 3; ++i) {
            for (int j = 0; j < 3; ++j) {
                result_copy[i][j] = result[i][j];
            }
        }

        multiply_matrix_3x3(base_matrix, result_copy, mod, result);
    }
}

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;

        int matrix[3][3] = {{a, b, c}, {1, 0, 0}, {0, 1, 0}};
        int result[3][3] = {0};

        fast_matrix_pow_3x3(matrix, (n-2), mod, result);

        cout << (1LL * result[0][0] * z
                + 1LL * result[0][1] * y
                + 1LL * result[0][2] * x) % mod << '\n';
    }

    return 0;
}