P10503 - 233 Matrix 题解

535 字
3 分钟
P10503 - 233 Matrix 题解
Done

您已获得最佳的阅读体验!

题目地址:P10503

假设我们有一个称为 233 矩阵。在第一行,它可能是 233、2333、23333…(表示 …)。此外,在 233 矩阵中,我们有 。现在已知 ,你能告诉我 233 矩阵中的 吗?

发现 很小、 很大,于是选择使用 的矩阵快速幂做法。

假设矩阵一开始存储 列的信息,它看起来是这样的:

由于涉及到 的计算,我们需要同时递推 相关项,显然有 ,出现了常数,连同 一起,初始矩阵就应该是如下的样子:

然后可以发现:

得出 的转移矩阵:

然后让初始矩阵乘以转移矩阵的 次幂即可。

#include <bits/stdc++.h>
#define N 15
#define MOD 10000007
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
int n, m;
struct Matrix {
ll mat[N][N]{};
Matrix() {
memset(mat, 0, sizeof mat);
}
void I() {
for (int i = 1; i <= n + 2; i++) mat[i][i] = 1;
}
};
Matrix operator*(const Matrix &l, const Matrix &r) {
Matrix res;
for (int i = 1; i <= n + 2; i++) {
for (int j = 1; j <= n + 2; j++) {
for (int k = 1; k <= n + 2; k++) {
res.mat[i][j] = (res.mat[i][j] + l.mat[i][k] % MOD * r.mat[k][j] % MOD) % MOD;
}
}
}
return res;
}
Matrix qpow(Matrix a, ll b) {
Matrix res;
res.I();
while (b) {
if (b & 1) res = res * a;
a = a * a;
b >>= 1;
}
return res;
}
void print(Matrix m) {
for (int i = 1; i <= n + 2; i++) {
for (int j = 1; j <= n + 2; j++) {
cout << setw(5) << m.mat[i][j] << ' ';
}
cout << endl;
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
while (cin >> n >> m) {
Matrix A, M;
A.mat[1][1] = 1, A.mat[1][2] = 23;
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
A.mat[1][i + 2] = x;
}
for (int i = 1; i <= n + 2; i++) {
for (int j = i; j <= n + 2; j++) {
M.mat[i][j] = 1;
}
}
for (int i = 2; i <= n + 2; i++) M.mat[1][i] = 3, M.mat[2][i] = 10;
A = A * qpow(M, m);
cout << A.mat[1][n + 2] % MOD << endl;
}
return 0;
}

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

P10503 - 233 Matrix 题解
https://justpureh2o.cn/articles/23333/
作者
JustPureH2O
发布于
2024-09-01
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
JustPureH2O
穷方圆平直之情,尽规矩准绳之用
公告
JustPureH2O 的博客现已正式迁移至 Astro!原 Hexo 网站将移至 https://hexo.justpureh2o.cn/
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
101
分类
13
标签
56
总字数
374,694
运行时长
0
最后活动
0 天前

目录