矩阵快速幂自动初始化矩阵

正确打开方式:

  1. 输入初始矩阵的列数(同时也是转移矩阵的行数与列数)。
  2. 输入初始矩阵(一个数列,长度为 n n n)。
  3. 输入转移矩阵(一个矩阵,大小为 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 n1 次幂。

立 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}");
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值