Cod sursa(job #2949656)

Utilizator MAlex2019Melintioi George Alexandru MAlex2019 Data 1 decembrie 2022 13:15:26
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>
#include <vector>

using namespace std;

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

typedef long long ll;
ll const MOD = 666013;

struct matrix {
    vector<vector<int>> mat;

    matrix(int n) {
        mat.resize(3);
        for (int i = 0; i < 3; i++)
            mat[i].resize(3);
    }

    matrix operator * (matrix other) {
        matrix ans(1);
        for (int i = 0; i < 3; i++)
            for (int j = 0; j < 3; j++)
                for (int k = 0; k < 3; k++)
                    ans.mat[i][j] = (ans.mat[i][j] + (1LL * mat[i][k] * other.mat[k][j]) % MOD) % MOD;
        return ans;
    }
};

matrix logPow(matrix a, int b) {
    matrix ans(1);
    for (int i = 0; i < 3; i++)
        ans.mat[i][i] = 1;
    while (b) {
        if (b & 1)
            ans = ans * a;
        a = a * a;
        b >>= 1;
    }
    return ans;
}

int main() {
    int t;
    fin >> t;
    while (t--) {
        int x, y, z, a, b, c, n;
        fin >> x >> y >> z >> a >> b >> c >> n;

        matrix init(1);
        init.mat[0][0] = x;
        init.mat[1][0] = y;
        init.mat[2][0] = z;

        matrix mult(1);
        mult.mat[0][1] = 1;
        mult.mat[1][2] = 1;
        mult.mat[2][0] = c;
        mult.mat[2][1] = b;
        mult.mat[2][2] = a;

        mult = logPow(mult, n - 2);

        matrix answer(1);
        answer = mult * init;
        fout << answer.mat[2][0] << "\n";
    }
    return 0;
}