又是数数的一天
lizihan250 · · 题解
题目大意:给定一个可重集合
考虑怎样的
对于每个数
显然的,对于任意的在
那么没有在
于是我们考虑
#include<bits/stdc++.h>
using namespace std;
const int Maxn=5000,mod=998244353;
int T,n,cnt[Maxn+10];
long long ans;
long long f[Maxn+10];
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>T;
while(T--)
{
cin>>n;
for(int i=1;i<=n;i++)
cnt[i]=0;
int mx=0,p;
for(int i=1,x;i<=n;i++)
{
cin>>x;
cnt[x]++;
}
for(int i=1;i<=n;i++)
if(cnt[i]>mx) mx=cnt[i],p=i;
ans=mx;
for(int i=1;i<=n;i++)
if(i!=p) ans=(ans*(cnt[i]+1))%mod;
for(int i=1;i<=n;i++)
f[i]=0;
f[0]=1;
for(int i=1;i<=n;i++)
{
if(i==p) continue;
for(int j=n-mx;j>=0;j--)
f[j+cnt[i]]=(f[j+cnt[i]]+f[j]*cnt[i]%mod)%mod;
}
for(int i=mx;i<=n-mx;i++)
ans=(ans+f[i])%mod;
cout<<ans<<"\n";
}
return 0;
}