Trilogy valid array
unknown
c_cpp
6 months ago
2.0 kB
2
Indexable
#include <bits/stdc++.h> using namespace std; const int MOD = 1e9 + 7; vector<vector<long long>> matrixMultiply(const vector<vector<long long>>& A, const vector<vector<long long>>& B) { int n = A.size(); vector<vector<long long>> res(n, vector<long long>(n, 0)); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { long long sum = 0; for (int k = 0; k < n; ++k) { sum = (sum + A[i][k] * B[k][j]) % MOD; } res[i][j] = sum; } } return res; } vector<vector<long long>> powerMatrix(const vector<vector<long long>>& base, long long exp) { int size = base.size(); vector<vector<long long>> result(size, vector<long long>(size, 0)); // Initializing result as identity matrix for (int i = 0; i < size; ++i) { result[i][i] = 1; } vector<vector<long long>> baseCopy = base; while (exp) { if (exp % 2 == 1) { result = matrixMultiply(result, baseCopy); } baseCopy = matrixMultiply(baseCopy, baseCopy); exp /= 2; } return result; } int solve(long long A, int B, int C) { if (A == 0) return 0; vector<long long> initial(B, 0); initial[0] = C % MOD; vector<vector<long long>> matrix(B, vector<long long>(B, 0)); for (int i = 0; i < B; ++i) { if (i + 1 < B) matrix[i][i + 1] = 1; // Transitioning to the next state matrix[i][0] = (C - 1) % MOD; // Contribution from previous state } vector<vector<long long>> poweredMatrix = powerMatrix(matrix, A - 1); long long totalSum = 0; for (int i = 0; i < B; ++i) { long long sum = 0; for (int j = 0; j < B; ++j) { sum = (sum + initial[j] * poweredMatrix[j][i]) % MOD; } totalSum = (totalSum + sum) % MOD; } return totalSum; } int main() { long long A; int B, C; cin >> A >> B >> C; cout << solve(A, B, C) << endl; return 0; }
Editor is loading...
Leave a Comment