首页 > 其他分享 >AtCoder Beginner Contest 331 G - Collect Them All【概率期望+容斥+多项式】

AtCoder Beginner Contest 331 G - Collect Them All【概率期望+容斥+多项式】

时间:2023-12-10 16:33:08浏览次数:36  
标签:AtCoder Them 抽取 Beginner limits infty sum 概率 抽到

题目链接:ABC331_G

写在前面 将来如果回顾这道题,建议自己看完题意一定先重新推一遍。如果还是不够熟练,多去做一些同类型的题目吧。

题意:

盒子里有 \(N\) 张卡片,每张卡片上写着一个数字,数字的范围是 \(1,...,M\),写着数字 \(i\) 的卡片有 \(C_i\) 张\((C_i>0)\)。有放回地抽取卡片,每次抽取一张,问抽到过全部 \(M\) 种数字的期望抽取次数是多少?
\((1\leq M\leq N\leq2\times10^5)\)

思路梳理:

概率期望

首先转化该题的概率期望部分。
对于这种“询问抽到过全部 \(M\) 种物品的期望次数”的期望类题目,经典的套路是将期望转化为概率的后缀和

设 \(E(i)\) 为抽取 \(i\) 次恰好抽齐的期望次数, \(P(i)\) 为抽取 \(i\) 次恰好抽齐的概率,则有:

\(Ans = \sum\limits_{i=1}^{\infty}E(i) = \sum\limits_{i=1}^{\infty}P(i)\times i\)

设 \(suf(i)\) 为 \(P(i)\) 的后缀和,即 \(suf(i) = \sum\limits_{j=i}^{\infty}P(j)\)

于是又有:\(\sum\limits_{i=1}^{\infty}P(i)\times i = \sum\limits_{i=1}^{\infty}suf(i)\)

考虑 \(suf(i)\) 的实际含义,作为 \(P(i)\) 的后缀和,它表示抽取至少 \(i\) 次才抽齐的概率,也就是抽取 \(i-1\) 次都没有抽齐的概率。

设 \(P_1(i)\) 为抽取 \(i\) 次都没有抽齐的概率,于是得到:\(Ans = \sum\limits_{i=1}^{\infty}suf(i) = \sum\limits_{i=0}^{\infty}P_1(i)\)

容斥

现在来考虑 \(P_1(i)\) 该如何求得。先枚举抽取次数 \(i\) ,再枚举被抽到数字的集合 \(T\)(\(T\varsubsetneqq U\),此处计算没有抽齐的情况,因此 \(T\) 为全集 \(U\) 的真子集)。设 \(f(i,T)\) 为抽取 \(i\) 次抽到数字的集合至多为 \(T\) (即没有抽到 \(T\) 集合外的数字)的概率, \(F(T)\) 为抽到数字的集合恰好为 \(T\) 的概率(包含抽取 \(0\sim \infty\) 次的情况),则答案为:

\(Ans = \sum\limits_{i=0}^{\infty}P_1(i) = \sum\limits_{i=0}^{\infty}\sum\limits_{T\varsubsetneqq U}^{\infty}f(i,T) = \sum\limits_{T\varsubsetneqq U}^{\infty}F(T)\)

现在将答案表示成了一个与集合有关的概率,但 \(F(T)\) 是一个不好计算的东西。“恰好”难于计算的情况下,可以考虑容斥的思想,将容易计算的“至多/至少”通过容斥的方法转化成难于计算的“恰好”。

设 \(G(T)\) 为抽到数字的集合至多为 \(T\) (即没有抽到 \(T\) 集合外的数字)的概率,发现 \(G(T)\) 是容易计算的:

\(G(T)=\sum\limits_{i=0}^{\infty}\left(\frac {1}{n} \times \sum\limits_{x\in T}C_x\right)^i\)

可以发现 \(G(T)\) 为等比级数求和,于是有:

\(G(T)= \frac {\sum\limits_{x\in T}C_x}{n-\sum\limits_{x\in T}C_x}\)

建立“至多/至少”和“恰好”的关系,设 \(C(T)\) 为 \(F(T)\) 需要产生的贡献, \(coef(T)\) 为容斥系数,有容斥方法:

\(\sum\limits_{T\varsubsetneqq U}^{\infty}F(T)\times C(T) = \sum\limits_{T\varsubsetneqq U}^{\infty}G(T)\times coef(T)\)

由上面的答案计算式,可以得到 \(C(T) = 1\)。因为“至多”包含“恰好”,\(G(T)\) 包含 \(F(T)\), 在容斥中从包含的一方向被包含转移,得到 \(coef(T) = C(T) - \sum\limits_{S\varsubsetneqq T}coef(S)\)。

标签:AtCoder,Them,抽取,Beginner,limits,infty,sum,概率,抽到
From: https://www.cnblogs.com/chloris/p/17884117.html

相关文章

  • 什么是 @openui5/themelib_sap_fiori_3
    @openui5/themelib_sap_fiori_3是SAPUI5的一个主题库,它包含SAPFiori3的样式和设计元素。SAPFiori是SAP的用户体验(UserExperience,简称UX)设计语言,其设计准则注重简单性,可个性化,并且能在不同设备之间提供一致的用户体验。Fiori3是Fiori的最新版本,提供了更加现代化和......
  • Daiwa Securities Co. Ltd. Programming Contest 2023(AtCoder Beginner Contest 331)
    DaiwaSecuritiesCo.Ltd.ProgrammingContest2023(AtCoderBeginnerContest331)A-Tomorrow解题思路:模拟。代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;typedefpair<int,int>pii;#definefifirst#definesesecondcons......
  • AtCoder Beginner Contest 331
    A-Tomorrow(abc331A)题目大意给定一年的月数和一月的天数,以及当天日期,问次日的日期。解题思路一个简单的进制加法运算,超出进制数则向前加一。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_st......
  • AtCoder Beginner Contest 328
    AtCoderBeginnerContest328链接:ToyotaProgrammingContest2023#7(AtCoderBeginnerContest328)-AtCoderA题意:给定n个数,将小于等于x的数加起来输出。#include<bits/stdc++.h>#defineintlonglong#defineendl'\n';usingnamespacestd;voidsolve(){......
  • AtCoder Beginner Contest 331
    AtCoderBeginnerContest331这场状态好差,下午的校赛也打的好差。A-Tomorrow#include<bits/stdc++.h>#defineintlonglong#defineendl'\n'usingnamespacestd;voidsolve(){intM,D;inty,m,d;cin>>M>>D>>y>>m>&......
  • AtCoder Beginner Contest 331 G Collect Them All
    洛谷传送门AtCoder传送门设数字\(i\)第一次拿到的时间为\(t_i\),所求即为\(E(\max\limits_{i=1}^mt_i)\)。施min-max容斥,有:\[\begin{aligned}E(\max\limits_{i=1}^mt_i)&=\sum\limits_{T\subseteq[1,m]\landT\ne\varnothing}(-1)^{|T|-1}E(\min\l......
  • AtCoder Beginner Contest 331
    B-BuyOneCartonofMilk难度:⭐题目大意选择有三种套餐,6个鸡蛋S元,8个鸡蛋M元,12个鸡蛋L元;问如果要买至少N个鸡蛋,最少花费多少钱;解题思路一道入门级dp;神秘代码#include<bits/stdc++.h>#defineintlonglong#defineIOSios::sync_with_stdio(false......
  • AtCoder Beginner Contest 295
    B-Bombs题意:就是说有一种炸弹,能炸曼哈顿距离的障碍物,要你打印出炸完后的图模拟#include<bits/stdc++.h>usingnamespacestd;charmp[50][50];voidsolve(){ intn,m; cin>>n>>m; for(inti=1;i<=n;i++){ for(intj=1;j<=m;j++){ cin>>mp[i][j]; } } for......
  • AtCoder Beginner Contest 326
    B-326-likeNumbers题意:找到一个不小于n的数是326数,定义是思路:简单的模拟循环即可#include<bits/stdc++.h>usingnamespacestd;boolcheck(intx){ vector<int>a; while(x){ a.push_back(x%10); x/=10; } if(a[1]*a[2]==a[0])returntrue; elsereturnfalse;}......
  • AtCoder_abc326
    T12UP3DOWN简单的if判断,做题一分钟,翻译十分钟。。。代码:#include<bits/stdc++.h>usingnamespacestd;intmain(){ intx,y;cin>>x>>y; if((x<=y&&y-x<=2)||(x>y&&x-y<=3)) cout<<"Yes"; elsecout<<"No&......