社区讨论

未过样例求条

P10502Matrix Power Series参与者 4已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mmdetvgn
此快照首次捕获于
2026/03/05 19:56
5 天前
此快照最后确认于
2026/03/07 18:40
3 天前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mod,n,k;
struct smatrix{
	ll a[40][40],sn,sm;
	smatrix(){memset(a,0,sizeof(a));sn = sm = 0;}
}I,Z,aa;
struct bmatrix{
	smatrix b[40][40];
	ll bn,bm;
	bmatrix(){for(int i = 1;i<=39;i++)for(int j = 1;j<=39;j++)b[i][j] = Z;bn = bm = 0;}
}f,ans;
smatrix operator+(smatrix x,smatrix y){
	smatrix z;
	z.sn = x.sn,z.sm = x.sm;
	for(int i = 1;i<=x.sn;i++)
		for(int j = 1;j<=x.sm;j++)
			z.a[i][j] = (x.a[i][j]+y.a[i][j])%mod;
	return z;
}
smatrix operator*(smatrix x,smatrix y){
	smatrix z;
	z.sn = x.sn,z.sm = y.sm;
	for(int i = 1;i<=x.sn;i++)
		for(int j = 1;j<=y.sm;j++)
			for(int k = 1;k<=x.sm;k++)
				z.a[i][j] = (z.a[i][j]+x.a[i][k]*y.a[k][j])%mod;
	return z;
}
bmatrix operator*(bmatrix x,bmatrix y){
	bmatrix z;
	for(int i = 1;i<=x.bn;i++)
		for(int j = 1;j<=y.bm;j++)
			for(int k = 1;k<=x.bm;k++)
				z.b[i][j] = z.b[i][j]+x.b[i][k]*y.b[k][j];
	z.bn = x.bn,z.bm = y.bm;
	return z;
}
int main(){
	cin.tie(0)->sync_with_stdio(0);
	cout.tie(0);
	cin>>n>>k>>mod;
	aa.sn = aa.sm = I.sn = I.sm = Z.sn = Z.sm = n;
	for(int i = 1;i<=n;i++)I.a[i][i] = 1;
	for(int i = 1;i<=n;i++)
		for(int j = 1;j<=n;j++)
			cin>>aa.a[i][j];
	f.b[1][1] = f.b[1][2] = I;
	f.b[2][1] = Z,f.b[2][2] = aa;
	f.bn = f.bm = 2;
	ans.b[1][1] = aa,ans.b[2][1] = aa*aa;
	ans.bn = 2,ans.bm = 1;
	k--;
	while(k){
		if(k&1)ans = ans*f;
		f = f*f;
		k>>=1;
	}
	for(int i = 1;i<=n;i++){
		for(int j = 1;j<=n;j++)cout<<ans.b[1][1].a[i][j]<<' ';
		cout<<'\n';
	}
	return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...