初中生第一次参加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;
}