在线IDE运行正常,本地报错求助
  • 板块学术版
  • 楼主ABCDTNT__
  • 当前回复12
  • 已保存回复12
  • 发布时间2022/11/19 13:49
  • 上次更新2023/10/27 02:23:52
查看原帖
在线IDE运行正常,本地报错求助
229445
ABCDTNT__楼主2022/11/19 13:49

题目为给定m×mm\times m矩阵的矩阵与正整数nn,求 A1++AnA^1+\cdots+A^n 的值. 下面是代码,在标////////////处报错,错误代码为3221225725,调试信息显示段错误,但是洛谷IDE却正常运行、输出正确.

算法核心思想:二分求答案. (见代码中query(Matrix,int)部分)

f(n)=A++Anf(n)=A+\cdots+A^n,则(由简单的数学推导得) f(2k+1)=f(2k)+A2k+1f(2k+1)=f(2k)+A^{2k+1} f(2k)=(Ak+E)f(k)f(2k)=(A^k+E)f(k) 这里EE为单位矩阵.

求dalao看看问题在哪!

输入:(第一行为m,nm,n,后面为m×mm\times m矩阵)

3 2
8 7
5 5

输出:

1354 1246
890 820

代码:

#include <bits/stdc++.h>
using namespace std;
const int MAXM=205;
struct Matrix{//矩阵
	int m;
	int a[MAXM][MAXM]={};
	void init(int mm){
		m=mm;
		for(int i(1);i<=m;++i){
			for(int j(1);j<=m;++j){
				a[i][j]=0;
			}
		}
	}
};
Matrix ME(int m){//单位矩阵
	Matrix ans;
	ans.init(m);
	for(int i(1);i<=m;++i){
		ans.a[i][i]=1;
	}
	return ans;
}
Matrix add(Matrix x,Matrix y){//矩阵加法
	Matrix ans;
	if(x.m!=y.m){
		ans.init(0);
		return ans;
	}
	int MatM=x.m;
	ans.init(MatM);
	for(int i(1);i<=MatM;++i){
		for(int j(1);j<=MatM;++j){
			ans.a[i][j]=x.a[i][j]+y.a[i][j];
		}
	}
	return ans;
}
Matrix mul(Matrix x,Matrix y){//矩阵乘法
	Matrix ans;
	if(x.m!=y.m){
		ans.init(0);
		return ans;
	}
	int MatM=x.m;
	ans.init(MatM);
	for(int i(1);i<=MatM;++i){
		for(int j(1);j<=MatM;++j){
			for(int k(1);k<=MatM;++k){
				ans.a[i][j]+=x.a[i][k]*y.a[k][j];
			}
		}
	}
	return ans;
}
Matrix quickpow(Matrix x,int t){//矩阵快速幂
	Matrix ans,s;
	ans=ME(x.m);s=x;
	while(t>0){
		if(t&1) ans=mul(ans,s);
		s=mul(s,s);t>>=1;
	}
	return ans;
}
Matrix query(Matrix A,int n){//核心:二分求答案
	if(n<=0) return ME(A.m);
	if(n==1) return A;
	if(n%2==1){
		return add(query(A,n-1),quickpow(A,n));//////////////此处报错
	}
	cout<<"n%2==0!"<<n<<endl;
	return mul(add(quickpow(A,n/2),ME(A.m)),query(A,n/2));
}
int main() {//输入输出
	int n,m;
	scanf("%d%d",&n,&m);
	Matrix A;A.init(m);
	for(int i(1);i<=m;++i){
		for(int j(1);j<=m;++j){
			scanf("%d",&A.a[i][j]);
		}
	}
	Matrix ans=query(A,n);
	for(int i(1);i<=m;++i){
		for(int j(1);j<=m;++j){
			printf("%d ",ans.a[i][j]);
		}
		printf("\n");
	}
	return 0;
}
2022/11/19 13:49
加载中...