正确打开方式:
- 输入初始矩阵的列数(同时也是转移矩阵的行数与列数)。
- 输入初始矩阵(一个数列,长度为
n
n
n)。
- 输入转移矩阵(一个矩阵,大小为
n
×
n
n \times n
n×n)。
注意事项:
- 原代码默认模数为
1
0
9
+
7
10^9 + 7
109+7。
- 原代码使用了
#define int long long
。 - 原代码默认
f
1
f_1
f1 是已知的,也就是只用计算
n
−
1
n - 1
n−1 次幂。
立 flag
#include<bits/stdc++.h>
#include<windows.h>
#define cls system("cls")
using namespace std;
string a[1005][1005],b[1005];
int main()
{
cout<<"原来,你也写矩阵快速幂!\n";
Sleep(114);
cls;
int n;
cout<<"请输入初始矩阵的列数\n";
cin>>n;
if (n>1000){
cout<<"这样会 T 掉的\n";
return 0;
}
cout<<"请输入初始矩阵\n";
for (int i=1;i<=n;i++){
cin>>b[i];
}
cout<<"请输入转移矩阵\n";
for (int i=1;i<=n;i++){
for (int j=1;j<=n;j++){
cin>>a[i][j];
}
}
printf("#include <bits/stdc++.h>\n#define int long long\nusing namespace std;\nconst int maxn = 100 + 10;\nint mod = 1e9+7;\ntypedef long long ll;\nstruct Matrix {\n long long a[maxn][maxn];\n Matrix() { memset(a, 0, sizeof a); }\n Matrix operator*(const Matrix &b) const {\n Matrix res;\n for (int i = 1; i <= %d; ++i) for (int j = 1; j <= %d; ++j) for (int k = 1; k <= %d; ++k) res.a[i][j] = (res.a[i][j] + a[i][k] * b.a[k][j]) %% mod;\n return res;\n }\n}ans;",n,n,n);
printf("\nMatrix Pow(Matrix &base, ll n) {\n Matrix res;\n for(int i = 1; i <= %d; i ++) res.a[i][i] = 1;\n while (n != 0) {\n if (n & 1) res = res * base;\n base = base * base;\n n >>= 1;\n }\n return res;\n}",n);
printf("\nsigned main() {\n int n;\n cin>>n;\n Matrix f,cnt;");
for (int i=1;i<=n;i++){
printf("\n f.a[1][%d]=",i);
cout<<b[i]<<";";
}
for (int i=1;i<=n;i++){
for (int j=1;j<=n;j++){
printf("\n cnt.a[%d][%d] = ",i,j);
cout<<a[i][j]<<";";
}
}
printf("\n Matrix b = Pow(cnt, n - 1);\n b = f * b;\n cout << b.a[1][1];\n}");
}