萌新妹子刚学OI DP求调
查看原帖
萌新妹子刚学OI DP求调
374756
忘怜城羡楼主2024/3/28 20:42
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2001;
int n,k,p,dp[MAXN][MAXN],sum[MAXN][MAXN],cnt[MAXN][MAXN],tot,ans;
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d%d",&n,&k,&p);
		for(int i(0);i<=n+1;++i)
			for(int j(0);j<=n+1;++j)
				sum[i][j]=dp[i][j]=cnt[i][j]=0;	
		ans=0;
		dp[0][0]=1;
		for(int i(0);i<=k;++i)
			dp[1][i]=1;
		for(int i(2);i<=n+1;++i)
		{
			tot=0;
			for(int j(0);j<=k;++j)
				(tot+=dp[i-1][j])%=p;
			sum[i-2][0]=dp[i-2][0]*k%p;
			cnt[i-2][0]=dp[i-2][0]%p;
			for(int j(1);j<=k;++j)
			{
				sum[i-2][j]=(sum[i-2][j-1]+dp[i-2][j]*(k-j)%p)%p;
				cnt[i-2][j]=(sum[i-2][j-1]+dp[i-2][j])%p;
			}
			for(int j(0);j<=k;++j)
				dp[i][j]=(tot-(sum[i-2][k-j]-cnt[i-2][k-j]*j)%p+p)%p;
		}
		printf("%d\n",dp[n+1][0]);
	}
	return 0;
}
2024/3/28 20:42
加载中...