70分求助
查看原帖
70分求助
210719
Violet___Evergarden楼主2022/11/23 13:05

初中生第一次参加noip,不知道要复习什么

#include <iostream>
#define int long long
using namespace std;
const int kMaxN=50;
const int kMaxM=201;
const int kM=998244353;
int n,m,k;
int v[kMaxN],power[kMaxM][kMaxN],c[kMaxN][kMaxN];
int dp[kMaxM][kMaxN][kMaxN][kMaxN],ans;
int Count(int x)
{
	int ans=0;
	while(x)
	{
		if(x%2==1)ans++;
		x/=2;
	}
	return ans;
}
signed main()
{
cin>>n>>m>>k;
c[0][0]=1;
for(int i=1;i<=n;i++)
{
	c[i][0]=1;
	for(int j=1;j<=i;j++)
	{
		c[i][j]=c[i-1][j]+c[i-1][j-1];
		c[i][j]%=kM;
	}
}
for(int i=0;i<=m;i++)
{
	cin>>v[i];
}
for(int i=0;i<=m;i++)
{
	power[i][0]=1;
	for(int j=1;j<=n;j++)
	{
		power[i][j]=power[i][j-1]*v[i]%kM;
	}
}
dp[0][0][0][0]=1;
for(int i=0;i<=m;i++)
{
	for(int j=0;j<=n;j++)
	{
		for(int kk=0;kk<=k;kk++)
		{
			for(int l=0;l<=n/2;l++)
			{
				for(int o=0;o<=n-j;o++)
				{
					dp[i+1][j+o][kk+((l+o)%2)][(l+o)/2]+=dp[i][j][kk][l]*power[i][o]%kM*c[n-j][o]%kM;
					//cout<<o<<" "<<power[i][o]<<" "<<c[n-j][0]<<"\n";
					dp[i+1][j+o][kk+((l+o)%2)][(l+o)/2]%=kM;
				}
				//cout<<i<<" "<<j<<" "<<kk<<" "<<l<<" "<<dp[i][j][kk][l]<<"\n";
			}
		}
	}
}
for(int i=0;i<=k;i++)
{
	for(int j=0;j<=n/2;j++)
	{
	 if(i+Count(j)<=k)ans+=dp[m+1][n][i][j],ans%=kM;
	}
}
cout<<ans;
return 0;
}
2022/11/23 13:05
加载中...