封装矩阵快速幂,爆0
查看原帖
封装矩阵快速幂,爆0
608273
___PatrickChen___楼主2023/8/24 17:17
#include <bits/stdc++.h>
#define endl '\n'

using namespace std;

typedef long long ll;

const ll mod=1000000007; 

struct Matrix{
	ll n,m,a[110][110];
	Matrix():n(0),m(0){}
	Matrix(int N,int M,bool f=0):n(N),m(M){
		if(!f)memset(a,0,sizeof a);
		else for(int i=1;i<=n;++i)a[i][i]=1;
	}
	const friend Matrix operator*(Matrix& lhs,Matrix& rhs){
		Matrix ans(lhs.n,rhs.m);
		for(int i=1;i<=lhs.n;++i){
			for(int j=1;j<=rhs.m;++j){
				for(int k=1;k<=lhs.m;++k)ans.a[i][j]=(ans.a[i][j]+lhs.a[i][k]*rhs.a[k][j])%mod;
			}
		}
		return ans;
	}
	friend Matrix pow(Matrix& a,ll exp){
		Matrix ans(a.n,a.n,1);
		while(exp){
			if(exp&1)ans=ans*a;
			a=a*a;
			exp>>=1;
		}
		return ans;
	}
	friend istream& operator>>(istream &is,Matrix& m){
		for(int i=1;i<=m.n;++i){
			for(int j=1;j<=m.m;++j)is >> m.a[i][j];
		}
		return is;
	}
	friend ostream& operator<<(ostream &os,const Matrix& m){
		for(int i=1;i<=m.n;++i,cout << endl){
			for(int j=1;j<=m.m;++j)os << m.a[i][j] << ' ';
		}
		return os;
	}
};
int n,k;

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> k;
	Matrix a(n,n),ans;
	cin >> a;
	ans=pow(a,k);
	cout << ans;
	return 0;
}

矩阵乘法以及输入输出流重载没问题(除非矩阵乘法的数据太水),估计是pow炸了

2023/8/24 17:17
加载中...