CF1156F Card Bag
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1156F Card Bag相关的知识,希望对你有一定的参考价值。
鏍囩锛?a href='http://www.mamicode.com/so/1/href' title='href'>href sort turn const math card a* i+1
Link
鏄剧劧璧㈠綋涓斾粎褰撳彇鐗岀殑搴忓垪鏋勬垚浜嗕竴涓崟璋冧笂鍗囩殑搴忓垪骞朵笖鏈€鍚庝袱涓暟鐩哥瓑銆?br />
鍏堟妸(a)鎺掑簭锛岀劧鍚庤€冭檻dp锛岃(f_{i,j})琛ㄧず鍙栦簡(i)寮犵墝锛岀(i)寮犵墝鏄?span class="math inline">(j)涓旀父鎴忓皻鏈粨鏉熺殑姒傜巼銆?br />
涓轰簡鏂逛究鎴戜滑瑙勫畾鍚屾牱澶у皬鐨勭墝蹇呴』鍏堝彇灏忕殑銆?br />
鍥犳鎴戜滑鏈夛細
(egin{cases}f_{i,j}=frac{(sumlimits_{k=1}^{j-1}f_{i-1,k})cnt_j}{n-i+1}&a_j
e a_{j-1}\ans+=frac{f_{i-1,j-1}(cnt_j-1)}{n-i+1}end{cases})
鍏朵腑(cnt)鏄《銆?/p>
#include<cstdio>
#include<algorithm>
const int N=5007,P=998244353;
int read(){int x;scanf("%d",&x);return x;}
void mod(int&x){x-=P,x+=x>>31&P;}
int mul(int a,int b){return 1ll*a*b%P;}
int pow(int a,int k){int r=1;for(;k;k>>=1,a=mul(a,a))if(k&1)r=mul(a,r);return r;}
int a[N],cnt[N],f[N][N],sum[N][N],inv[N];
int main()
{
int n=read(),ans=0;inv[0]=inv[1]=1;
for(int i=2;i<=n;++i) inv[i]=mul(inv[P%i],P-P/i);
for(int i=1;i<=n;++i) ++cnt[a[i]=read()];
std::sort(a+1,a+n+1),std::fill(sum[0],sum[0]+n+1,1),f[0][0]=1;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;j++) a[j]==a[j-1]? (mod(ans+=mul(mul(f[i-1][j-1],inv[n-i+1]),cnt[a[j]]-1)),0):f[i][j]=mul(mul(sum[i-1][j-1],inv[n-i+1]),cnt[a[j]]);
for(int j=1;j<=n;++j) mod(sum[i][j]=sum[i][j-1]+f[i][j]);
}
printf("%d",ans);
}
以上是关于CF1156F Card Bag的主要内容,如果未能解决你的问题,请参考以下文章