ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[ABC215G]Colorful Candies 2 题解

2022-04-19 20:03:16  阅读:150  来源: 互联网

标签:ABC215G cnt 颜色 int 题解 sum Candies 期望 binom


期望

Statement

G - Colorful Candies 2 (atcoder.jp)

给定 \(n\) 个糖果,第 \(i\) 个糖果颜色为 \(c_i\)

对于每个 \(k=1∼n\),求随机选出 \(k\) 个糖果,\(\binom nk\) 种情况中糖果颜色数的期望。答案模 \(998244353\)。

\(n\le 5\times 10^4\)

Solution

知道这类问题的一般套路都是先利用期望的线性性转化问题求解

但是不会用期望的线性性,于是最开始设了一个 \(dp[i][j][k]\) 表示前 \(i\) 种颜色中选择 \(j\) 个,选出 \(k\) 不同颜色的方案数,然后前缀和优化之后得到一个 \(O(n^3)\) 后发现状态实在减不动了,GG

回到正题,注意到本题中对答案有影响的是不同颜色的数量和每种颜色数量,并不关注每种颜色具体是什么

枚举 \(k\) ,题目要求计算 \(E(\sum x_i)\) ,\(x_i=1/0\) 表示选择 \(k\) 个数,颜色 \(i\) 是/否被选中

有 \(E(\sum x_i)=\sum E(x_i)\) ,考虑求出选择 \(k\) 个数中有 \(i\) 的期望

简单容斥一下,用总方案数-选不中方案数,设颜色 \(i\) 有 \(cnt_i\) 个

\[E(x_i)=\dfrac{\binom nk-\binom {n-cnt_i}k}{\binom nk} \]

暴力计算是 \(O(n^2)\) 的,考虑优化

注意到其实 \(cnt\) 相同的可以和在一起算,又 \(\sum cnt_i=n\) ,所以不同的 \(cnt\) 只有 \(\sqrt n\) 种,复杂度来到 \(O(n\sqrt n)\)

Code

#include<bits/stdc++.h>
using namespace std;
const int N = 5e4+5;
const int mod = 998244353;

char buf[1<<23],*p1=buf,*p2=buf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
int read(){
    int s=0,w=1; char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
    while(isdigit(ch))s=s*10+(ch^48),ch=getchar();
    return s*w;
}
int ksm(int a,int b){
    int res=1;
    while(b){
        if(b&1)res=1ll*res*a%mod;
        a=1ll*a*a%mod,b>>=1;
    }
    return res;
}
void inc(int &a,int b){a=a>=mod-b?a-mod+b:a+b;}

vector<int>vec;
int jc[N],invj[N],a[N],b[N];
int tong[N],cnt[N];
bool vis[N];
int n,m;

int C(int n,int m){
    if(n<m||m<0)return 0;
    return 1ll*jc[n]*invj[m]%mod*invj[n-m]%mod;
}

signed main(){
    n=read();
    for(int i=jc[0]=1;i<=n;++i)
        jc[i]=1ll*jc[i-1]*i%mod,a[i]=b[i]=read();
    invj[n]=ksm(jc[n],mod-2);
    for(int i=n-1;~i;--i)invj[i]=1ll*invj[i+1]*(i+1)%mod;
    sort(b+1,b+1+n),m=unique(b+1,b+1+n)-b-1;
    for(int i=1;i<=n;++i)
        tong[lower_bound(b+1,b+1+m,a[i])-b]++;
    for(int i=1;i<=m;++i){
        cnt[tong[i]]++;
        if(vis[tong[i]]==0)
            vec.push_back(tong[i]),vis[tong[i]]=1;
    }
    for(int k=1;k<=n;++k){
        int ans=0,all=C(n,k),invl=ksm(all,mod-2);
        for(auto v:vec)
            inc(ans,1ll*cnt[v]*((all-C(n-v,k)+mod)%mod)%mod*invl%mod);
        printf("%d\n",ans);
    }
    return 0;
}

标签:ABC215G,cnt,颜色,int,题解,sum,Candies,期望,binom
来源: https://www.cnblogs.com/wyb-sen/p/16167044.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有