矩阵快速幂
先贴一下快速幂的板子
void ksm(int a, int k) { // a^k
int res;
while (k) {
if (k & 1) res *= a;
k >>= 1;
a *= a;
}
return res;
}
众所周知,矩阵乘法的公式是
所以写个矩阵的结构体,和乘法的函数,套进快速幂就行了。时间复杂度
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 100 + 5, INF = 0x3f3f3f3f, mod = 1e9 + 7;
inline int read() {
int x = 0, f = 0; char ch = 0;
while (!isdigit(ch)) f |= ch == '-', ch = getchar();
while (isdigit(ch)) x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();
return f ? -x : x;
}
int n;
struct mat {
int m[N][N];
mat() {
memset(m, 0, sizeof(m));
for (int i = 0; i < N; i++) m[i][i] = 1;
}
};
mat mul(mat a, mat b) {
mat c;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++) {
c.m[i][j] = 0; //Mention!
for (int k = 1; k <= n; k++)
c.m[i][j] += a.m[i][k] * b.m[k][j] % mod;
c.m[i][j] %= mod;
}
return c;
}
mat ksm(mat a, int k) {
mat res;
while (k) {
if (k & 1) res = mul(res, a);
k >>= 1;
a = mul(a, a);
}
return res;
}
signed main() {
n = read(); int k = read();
mat a;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
a.m[i][j] = read();
mat ans = ksm(a, k);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++)
printf("%lld ", ans.m[i][j]);
puts("");
}
return 0;
}
【模板】矩阵加速
已知一个数列
,它满足
求
数列的第
项对
取余的值。
已知 发现可以推出
那么有
根据递推式
竖着写,用来加速的矩阵为
扫描二维码关注公众号,回复:
11484108 查看本文章