CF1740F Conditional Mix 题解
首先若可重集内元素个数不满
那么
从大到小选数。设
Code
#include<bits/stdc++.h>
#define mod 998244353
using namespace std;
int n,i0=0,i1=1;
int a[2002],cnt[2002],sum[2002];
int f[2][2002][2002];
inline bool cmp(int x,int y)
{
return x>y;
}
inline void upd(int &x,int y)
{
if((x+=y)>=mod)x-=mod;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)scanf("%d",&a[i]),++cnt[a[i]];
sort(cnt+1,cnt+n+1,cmp);
for(int i=0;i<=n;++i)for(int j=f[0][0][i]=1;j<=n;++j)sum[i]+=min(i,cnt[j]);
for(int i=1,u;i<=n;++i,i0^=1,i1^=1)
{
u=n/i;
for(int j=0;j<=sum[i];++j)f[i1][j][u+1]=0;
for(int k=u;~k;--k)for(int j=0;j<=sum[i];++j)upd(f[i1][j][k]=(j>=k? f[i0][j-k][k]:0),f[i1][j][k+1]);
}
return 0&printf("%d",f[i0][n][0]);
}