40pts,求助大佬
查看原帖
40pts,求助大佬
372708
Yahbim楼主2021/6/26 09:04

从昨天调到今天
dp[i][a][b]:到第i列,0个的有a行,1个的有b行时,方案的总数。

#include<bits/stdc++.h>
using namespace std;
const int MOD=9999973;
long long dp[105][105][105],t[105];
long long ftr(int p){//ftr:阶乘
	if(t[p]) return t[p];
	t[p]=p*ftr(p-1)%MOD;
	return t[p];
}
long long C(int m,int n){
	return (ftr(n)/((ftr(m)*ftr(n-m))%MOD))%MOD;
}
int main(){
	t[0]=t[1]=1;
	int n,m;
	cin>>n>>m;
	dp[0][m][0]=1;
	for(int i=1;i<=n;i++){
		for(int a=0;a<=m;a++)
			for(int b=0;b<=m-a;b++){
				//if none put
				dp[i][a][b]=(dp[i][a][b]+dp[i-1][a][b])%MOD;
				//if only one put
				if(b>=1 && a<=m-1) dp[i][a][b]=(dp[i][a][b]+dp[i-1][a+1][b-1]*(a+1))%MOD;
				if(b<=m-1) dp[i][a][b]=(dp[i][a][b]+dp[i-1][a][b+1]*(b+1))%MOD;
				//if two put
				if(b>=2 && a<=m-2) dp[i][a][b]=(dp[i][a][b]+dp[i-1][a+2][b-2]*C(2,a+2))%MOD;
				if(a<=m-1) dp[i][a][b]=(dp[i][a][b]+dp[i-1][a+1][b]*(a+1)*b)%MOD;
				if(b<=m-2) dp[i][a][b]=(dp[i][a][b]+dp[i-1][a][b+2]*C(2,b+2))%MOD;
			}
	}
	long long ans=0;
	for(int a=0;a<=m;a++)
		for(int b=0;b<=m;b++)
			ans=(ans+dp[n][a][b])%MOD;
//	for(int i=0;i<=n;i++){
//		for(int a=0;a<=m;a++)
//			for(int b=0;b<=m;b++)
//				printf("dp[%d][%d][%d]=%d\n",i,a,b,dp[i][a][b]);
//		cout<<endl;
//	}
	cout<<ans;
	return 0;
}
2021/6/26 09:04
加载中...