题目为给定m×m矩阵的矩阵与正整数n,求
A1+⋯+An
的值. 下面是代码,在标////////////处报错,错误代码为3221225725,调试信息显示段错误,但是洛谷IDE却正常运行、输出正确.
算法核心思想:二分求答案. (见代码中query(Matrix,int)部分)
令f(n)=A+⋯+An,则(由简单的数学推导得) f(2k+1)=f(2k)+A2k+1 f(2k)=(Ak+E)f(k) 这里E为单位矩阵.
求dalao看看问题在哪!
输入:(第一行为m,n,后面为m×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;
}