题意:nnn个人共有mmm个饼干,每轮随机选一个饼干随机给一个另外的人,所有饼干都在一个人手里时游戏结束,求期望进行次数。模998244353998244353998244353。

n≤105,m≤3×105n\leq10^5,m\leq3\times10^5n≤105,m≤3×105

首先肯定是每个人作为最终获得所有饼干的人分别考虑。

但是如果只考虑这个人的话,无法确定游戏进行过程中是否已经在其他人那里结束了。

所以干脆改下规则:设当前考虑的人为xxx,规定只有xxx收集完所有饼干后游戏才结束。也就是有人收集完了所有饼干后,如果他不是xxx,游戏继续进行;否则游戏立即结束。

为了后面讲清楚,这里给一个不正式的严谨定义:设R,R1∼RnR,R_1\sim R_nR,R1​∼Rn​表示游戏遵循的规则,其中RRR表示任何一个人收集了所有饼干后游戏结束,即原来的规则。Rx(x∈[1,n])R_x(x\in[1,n])Rx​(x∈[1,n])表示只有xxx收集完游戏才结束的新规则。

设在RxR_xRx​下游戏期望进行的次数为Ex′E_x'Ex′​。即:设f′(x,i)f'(x,i)f′(x,i)表示游戏进行了iii步后结束且xxx获得了所有饼干的概率,Ex′=∑i=0∞i⋅f′(x,i)E'_x=\sum_{i=0}^{\infin}i\cdot f'(x,i)Ex′​=∑i=0∞​i⋅f′(x,i)

注:这个f′(x,i)f'(x,i)f′(x,i)和后面的f(x,i)f(x,i)f(x,i)只是为了方便理解定义,对推导没有影响。

我们考虑寻找新的规则和原来的规则的联系

在RRR下,设PxP_xPx​表示游戏结束时所有饼干在xxx手上的概率,ExE_xEx​表示所有饼干在xxx手上结束的所有情况 的 概率乘以时间 之和。(注意不是期望,概率的分母包括了在其他人那里结束的情况)

即:设f(x,i)f(x,i)f(x,i)表示游戏进行iii步后结束,xxx获得所有饼干的概率,Ex=∑i=0∞i⋅f(x,i),Px=∑i=0∞f(x,i)E_x=\sum_{i=0}^{\infin}i\cdot f(x,i),P_x=\sum_{i=0}^\infin f(x,i)Ex​=∑i=0∞​i⋅f(x,i),Px​=∑i=0∞​f(x,i)

有∑i=1nPi=1,∑i=1nEi=ans\sum_{i=1}^n P_i=1,\sum_{i=1}^nE_i=ans∑i=1n​Pi​=1,∑i=1n​Ei​=ans,ansansans为题目所求

设CCC表示在RjR_jRj​下,现在所有饼干在iii手上且i≠ji\neq ji​=j,游戏期望还要进行多少步。显然这是个与i,ji,ji,j无关的常数。

考虑用ExE_xEx​表示出Ex′E_x'Ex′​

为了方便,我们称一个状态为iii类关键点,当且仅当这个状态的所有饼干都在iii手上。

考虑在RxR_xRx​下的一场游戏,如果它只有结束状态这一个关键点,期望步数为ExE_xEx​

否则我们枚举第一个关键点的类别iii,显然i≠xi\neq xi​=x,不然游戏会提前结束。然后从这个关键点开始就是 从“所有点都在iii手上”这个状态开始的RxR_xRx​游戏,期望步数为CCC

所以:

Ex′=Ex+∑i=1n[i≠x](Ei+PiC)E'_x=E_x+\sum_{i=1}^n[i\neq x](E_i+P_iC)Ex′​=Ex​+i=1∑n​[i​=x](Ei​+Pi​C)

如果你想不通为什么CCC要乘上PiP_iPi​:

前面说过,Ex=∑i=0∞if(x,i)E_x=\sum_{i=0}^\infin if(x,i)Ex​=∑i=0∞​if(x,i)
换句话说,对于每一个iii,都有f(x,i)f(x,i)f(x,i)的可能性在iii步后 所有饼干都在xxx手上,在这里就是到达枚举的第一个关键点。
在这之后还需要CCC步来到最终结束的状态,即∑i=0∞(i+C)f(x,i)\sum_{i=0}^\infin(i+C)f(x,i)∑i=0∞​(i+C)f(x,i)
而Px=∑i=0∞f(x,i)P_x=\sum_{i=0}^{\infin}f(x,i)Px​=∑i=0∞​f(x,i),所以加上PiCP_iCPi​C就可以了

拆一下:

Ex′=Ex+∑i=1n[i≠x](Ei+PiC)E'_x=E_x+\sum_{i=1}^n[i\neq x](E_i+P_iC)Ex′​=Ex​+i=1∑n​[i​=x](Ei​+Pi​C)

Ex′=Ex+∑i=1n[i≠x]Ei+∑i=1n[i≠x]PiCE'_x=E_x+\sum_{i=1}^n[i\neq x]E_i+\sum_{i=1}^n[i\neq x]P_iCEx′​=Ex​+i=1∑n​[i​=x]Ei​+i=1∑n​[i​=x]Pi​C

Ex′=∑i=1nEx+C∑i=1n[i≠x]PiE'_x=\sum_{i=1}^nE_x+C\sum_{i=1}^n[i\neq x]P_iEx′​=i=1∑n​Ex​+Ci=1∑n​[i​=x]Pi​

Ex′=ans+C(1−px)E'_x=ans+C(1-p_x)Ex′​=ans+C(1−px​)

对x=1∼nx=1\sim nx=1∼n求和

∑i=1nEi′=n⋅ans+C(n−1)\sum_{i=1}^nE'_i=n\cdot ans+C(n-1)i=1∑n​Ei′​=n⋅ans+C(n−1)

只要求出Ex′E'_xEx′​和CCC的值,问题就解决了!

而CCC是严格包含于Ex′E_x'Ex′​的,所以我们的目标是解决新规则下的问题。

注意到在RxR_xRx​下,我们并不关心每个饼干具体在谁手上,我们只关心它在不在xxx手上

所以可以设f(i)f(i)f(i)表示当前xxx手上有iii个饼干时期望进行次数。

f(i)={1+1n−1f(i+1)+n−2n−1f(i)x=01+imf(i−1)+m−im(1n−1f(i+1)+n−2n−1f(i))0<x<m0x=mf(i)= \begin{cases} 1+\frac{1}{n-1}f(i+1)+\frac{n-2}{n-1}f(i)& x=0\\ 1+\frac{i}mf(i-1)+\frac{m-i}{m}(\frac{1}{n-1}f(i+1)+\frac{n-2}{n-1}f(i))& 0<x<m\\ 0 & x=m \end{cases}f(i)=⎩⎪⎨⎪⎧​1+n−11​f(i+1)+n−1n−2​f(i)1+mi​f(i−1)+mm−i​(n−11​f(i+1)+n−1n−2​f(i))0​x=00<x<mx=m​

解出这个方程就好了

暴力硬推是一种方法,这里有一个很优美的思路:

考虑中间的式子,记为

f(i)=Af(i−1)+Bf(i)+Cf(i+1)+1f(i)=Af(i-1)+Bf(i)+Cf(i+1)+1f(i)=Af(i−1)+Bf(i)+Cf(i+1)+1

Af(i−1)+(B−1)f(i)+Cf(i+1)+1=0Af(i-1)+(B-1)f(i)+Cf(i+1)+1=0Af(i−1)+(B−1)f(i)+Cf(i+1)+1=0

注意到A+B+C=1A+B+C=1A+B+C=1,设g(i)=f(i)−f(i+1)g(i)=f(i)-f(i+1)g(i)=f(i)−f(i+1)

A⋅g(i−1)+(A+B−1)g(i)+1=0A\cdot g(i-1)+(A+B-1)g(i)+1=0A⋅g(i−1)+(A+B−1)g(i)+1=0

g(i)=A⋅g(i−1)+1Cg(i)=\frac{A\cdot g(i-1)+1}{C}g(i)=CA⋅g(i−1)+1​

这样推一次就可以把ggg算出来,求个后缀和就得到了fff

然后Ex′=f(ai),C=f(0)E_x'=f(a_i),C=f(0)Ex′​=f(ai​),C=f(0)

复杂度O(n)O(n)O(n)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#define MAXN 300005
using namespace std;
inline int read()
{int ans=0;char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
const int MOD=998244353;
typedef long long ll;
inline int qpow(int a,int p)
{int ans=1;while (p){if (p&1) ans=(ll)ans*a%MOD;a=(ll)a*a%MOD;p>>=1;}return ans;
}
#define inv(x) qpow(x,MOD-2)
inline int add(const int& x,const int& y){return x+y>=MOD? x+y-MOD:x+y;}
inline int dec(const int& x,const int& y){return x<y? x-y+MOD: x-y;}
int a[MAXN],f[MAXN];
int main()
{int n=read(),m=0;for (int i=1;i<=n;i++) m+=(a[i]=read());f[0]=n-1;for (int i=1;i<m;i++) f[i]=((ll)i*inv(m)%MOD*f[i-1]%MOD+1)*m%MOD*(n-1)%MOD*inv(m-i)%MOD;for (int i=m;i>=0;i--) f[i]=add(f[i],f[i+1]);int sum=0;for (int i=1;i<=n;i++) sum=add(sum,f[a[i]]);sum=dec(sum,f[0]*(n-1ll)%MOD);sum=(ll)sum*inv(n)%MOD;cout<<sum;return 0;
}

【CF1349D】Slime and Biscuits【概率期望】【解方程】相关推荐

  1. 【概率期望】【NOIP模拟】切题

    [题目描述] Alice 出了 n 场比赛,第i场比赛有ai道题. 由于是提高组模拟赛,因此最多只会有三题. Bob 要来切这些题.由于他艺高人胆大,所以他的切题方式比较特别. Bob 从 1到 n这 ...

  2. ACM概率期望dp刷题总结

    这个周刷了很多概率期望有关的dp题目,缘起2016青岛D题和取log的神操作题HDU 5988 2016青岛区域赛 (最小费用流) 这类题目没有固定的模板,而且概率可以很容易插入一些经典模型,比如下面 ...

  3. 正态分布(高斯分布)、Q函数、误差函数、互补误差函数(定义,意义及互相之间的关系)高斯分布的分布概率反解

    1.正态分布 参考博客:https://www.cnblogs.com/htj10/p/8621771.html 概率密度函数的意义:理解概率密度函数 - 知乎 (zhihu.com) 若随机变量 服 ...

  4. python解复杂方程_Python数据处理篇之Sympy系列(五)---解方程

    前言 sympy不仅在符号运算方面强大,在解方程方面也是很强大. 本章节学习对应官网的:Solvers 官方教程 (一)求解多元一次方程-solve() 1.说明: 解多元一次方程可以使用solve( ...

  5. 第十一届山东省大学生程序设计竞赛 L. Construction of 5G Base Stations(概率期望,递推前缀和优化)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 第十一届山东省大学生程序设计竞赛 L. Construction of 5G Base Station ...

  6. java2的7次方怎么表示_python编程解方程第二弹:10行代码解二次方程(纯字符)...

    用纯字符串格式来记录二次方程: '3x^2-10x-8=0' 'x^2-2x+1=0' '3x^2+14x+8=0' 'x^2=9' 二次方怎么表示呢?比如上面的^表示法,或者是python风格的** ...

  7. 【BZOJ】3751: [NOIP2014]解方程【秦九韶公式】【大整数取模技巧】

    3751: [NOIP2014]解方程 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 4856  Solved: 983 [Submit][Stat ...

  8. 多元统计分析-概率,期望,方差,正态分布

    概率,期望,方差 只有一个变量时 F(x<=a) = ∫-∞af(x)dx 当区间取负无穷到正无穷时积分为1 推广到多元之后: 同理,当区间取满整个空间时,积分为1 f被称为概率密度函数 边缘分 ...

  9. 10.24T3 解方程 取模意义下运算+秦九韶算法

    #1228 解方程 描述 已知多项式方程: a0+a1x+a2x^2+..+anx^n=0 求这个方程在[1, m ] 内的整数解(n 和m 均为正整数) 输入 输入共n + 2 行. 第一行包含2 ...

  10. 洛谷P2312 解方程题解

    洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...

最新文章

  1. jQuery案例(底部导航图片切换)
  2. 顺序队列的表示和实现
  3. 总结一下php5.2.16与apache2.0的C++扩展开发整个过程
  4. Linux按照时间顺序列出文件
  5. Leetcode:search_insert_position
  6. 拳王虚拟项目公社:虚拟资源自动化赚钱的原理是什么?真的靠谱吗?会不会骗人?
  7. Python接通图灵机器人
  8. 二、【二维码扫描ZXing】
  9. 小黑小波比.Ubuntu14.04安装ffmpeg以及使用ffmpeg
  10. 给定一个介于0到1之间的实数(如0.625),打印他的二进制表示
  11. oracle自定义排序规则_Excel的排序方法,你会几种?
  12. Excel数据透视表
  13. 网页与服务器数据库数据交互,网页与ACCESS数据库如何实现数据交互?
  14. 2022研究生数学建模ABCDEF思路
  15. V10抢单系统源码(新增连单管理功能)
  16. LIO-SAM论文翻译
  17. 数据库查询时报IllegalArgumentException异常是什么原因?
  18. 怎样设置默认打印机(HttpPrinter 易桥打印中间件)
  19. 云笔记使用的感受!(有道云, 印象云, 未知云)
  20. python多线程、多进程

热门文章

  1. 裤子换裙子,就问你GAN的这波操作秀不秀
  2. 仿真模拟,需要注意这几点!
  3. python3读取文件夹-python3获取文件及文件夹大小
  4. python docx 字体大小_聊聊python办公自动化之Word(上)
  5. imac android studio,Mac安装Android Studio的时候忘记安装Avd Manager怎么办?
  6. 11尺寸长宽 iphone_LED显示屏的尺寸规格计算方法
  7. linux创建目录目录文件,Linux创建目录和文件管理教程
  8. android最好的3d游戏机,终极盘点:Android必玩十大超猛3D游戏
  9. android photopicker怎么修改状态栏,有没有办法阻止UIImagePickerController更改状态栏样式?...
  10. jenkins换服务器找不到包,服务器重启后Jenkins项目部分丢失问题解决方法