枚举最终的获得所有饼干的人$i$(以下简称"获胜者"),对于$i$获胜的情况,令其贡献为游戏轮数,否则其贡献为0,记$F_{i}$为期望贡献(即所有情况概率*贡献之和),答案即为$\sum_{i=1}^{n}F_{i}$

但此时的$F_{i}$比较复杂,其不仅取决于第$i$个人的饼干数量,还取决于别人的饼干数量,因为如果有一个人先获得了所有饼干,虽然游戏还可以继续,但$i$并不是获胜者

虽然如此,我们还是先算出在不管其他人的情况下(即另一个人获得所有饼干游戏并不结束),有$i$个饼干的人获胜的期望轮数$G_{i}$,则有$G_{a_{i}}=\sum_{j=1}^{n}F_{j}+(1-p_{i})G_{0}$

关于这个式子,$\sum_{j=1}^{n}g_{j}$即为游戏的期望轮数,那么这么多轮后,有$1-p_{i}$的概率并不是$i$获胜,而对于$G_{a_{i}}$来说此时还没有结束,而$i$必然只有0张牌,即还需要$G_{0}$步

将所有$i$累加,即$\sum_{i=1}^{n}G_{a_{i}}=n\sum_{j=1}^{n}F_{j}+(n-1)G_{0}$

由此,可以得到$\sum_{j=1}^{n}F_{j}=\frac{\sum_{i=1}^{n}G_{a_{i}}-(n-1)G_{0}}{n}$,下面考虑如何求出$G_{i}$,显然有转移
$$
\begin{cases}G_{S}=0\\G_{0}=\frac{n-2}{n-1}G_{0}+\frac{1}{n-1}G_{1}+1\\G_{i}=\frac{i}{S}G_{i-1}+\frac{S-i}{S}(\frac{1}{n-1}G_{i+1}+\frac{n-2}{n-1}G_{i})+1&(1\le i<S)\end{cases}
$$
将其变形,即有
$$
\begin{cases}G_{S}=0\\G_{0}=G_{1}+(n-1)\\\frac{S-i}{n-1}(G_{i}-G_{i+1})=i(G_{i-1}-G_{i})+S&(1\le i<S)\end{cases}
$$
记$g_{i}=G_{i}-G_{i+1}$,代入即
$$
\begin{cases}g_{0}=n-1\\g_{i}=\frac{n-1}{S-i}(i\cdot g_{i-1}+S)&(1\le i<S)\end{cases}
$$
由此即可算出$g_{i}$,再通过$G_{i}=\sum_{j=i}^{S-1}g_{j}$也即可算出$G_{i}$,进而也即可求出答案

总复杂度为$o(S)$,可以通过

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 300005
4 #define mod 998244353
5 #define ll long long
6 int n,m,ans,inv[N],a[N],g[N],G[N];
7 int main(){
8 inv[0]=inv[1]=1;
9 for(int i=2;i<N;i++)inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
10 scanf("%d",&n);
11 for(int i=1;i<=n;i++){
12 scanf("%d",&a[i]);
13 m+=a[i];
14 }
15 g[0]=n-1;
16 for(int i=1;i<m;i++){
17 int s=(ll)(n-1)*inv[m-i]%mod;
18 g[i]=((ll)i*g[i-1]+m)%mod*s%mod;
19 }
20 for(int i=m-1;i>=0;i--)G[i]=(G[i+1]+g[i])%mod;
21 ans=mod-(ll)(n-1)*G[0]%mod;
22 for(int i=1;i<=n;i++)ans=(ans+G[a[i]])%mod;
23 ans=(ll)ans*inv[n]%mod;
24 printf("%d",ans);
25 }

[cf1349D]Slime and Biscuits的更多相关文章

  1. Solution -「CF 1349D」Slime and Biscuits

    \(\mathcal{Description}\)   Link.   有 \(n\) 堆饼干,一开始第 \(i\) 堆有 \(a_i\) 块.每次操作从所有饼干中随机一块,将其随机丢到另外一堆.求所 ...

  2. [题解] Codeforces 1349 D Slime and Biscuits 概率,推式子,DP,解方程

    题目 神题.很多东西都不知道是怎么凑出来的,随意设置几个变量,之间就产生了密切的关系.下次碰到这种题应该还是不会做罢. 令\(E_x\)为最后结束时所有的饼干都在第x个人手中的概率*时间的和.\(an ...

  3. 更新lispbox中的ccl和slime版本

    首先C-x C-f然后输入~,找到.emacs文件,根据slime官方文档说明的添加如下代码到文件末尾,重启一下emacs,slime就编译好了,然后这段代码就可以删除.否则每次启动emacs就算不用 ...

  4. Wunder Fund Round 2016 (Div. 1 + Div. 2 combined) A. Slime Combining 水题

    A. Slime Combining 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2768 Description Your frien ...

  5. 编写php拓展实例--slime项目(用户登录会话类)

      最近公司换了yaf框架,突然对用c实现php拓展感兴趣了,如果一个功能已经很稳定很成熟而且用的地方很多,那么我们就可以尝试用拓展实现(不一定每种情况都可以写成拓展),写成拓展后就不用每次用都包含一 ...

  6. Windows下安装Emacs+Sbcl+Slime

    前言 其实网上已经有很多类似的文章了,我也是按照上面的来做.在做的过程中会遇到几个很坑的地方,我自己也是折腾了好久才弄好.所以现在写出来希望能对大家有所帮助. 正文 下载和安装Emacs http:/ ...

  7. slime+sbcl for common lisp

    sudo apt-get install slime audo apt-get install sbcl ;;sbcl+slime for common lisp ;;sudo apt-get ins ...

  8. Common Lisp学习笔记(0):从SLIME开始 | 优哉·幽斋

    Common Lisp学习笔记(0):从SLIME开始 | 优哉·幽斋 Common Lisp学习笔记(0):从SLIME开始

  9. 在 Emacs 中如何退出 Slime Mode

    1.在 Slime 的 Buffer 中按逗号“,”: 2.在 Command 后输入:sayoonara 3.回车,确认. ================ 退出 SBCL 输入:(sb-ext:q ...

随机推荐

  1. PTA数据结构 习题3.6 一元多项式的乘法与加法运算 (20分)

    一元多项式的乘法与加法运算 https://pintia.cn/problem-sets/434/problems/5865 设计函数分别求两个一元多项式的乘积与和. 时间限制:200 ms 内存限制 ...

  2. 分布式全局ID与分布式事务

    1. 概述 老话说的好:人不可貌相,海水不可斗量.以貌取人是非常不好的,我们要平等的对待每一个人. 言归正传,今天我们来聊一下分布式全局 ID 与分布式事务. 2. 分布式全局ID 2.1 分布式数据 ...

  3. vue如何监听数组的变化

    export function def (obj: Object, key: string, val: any, enumerable?: boolean) { Object.defineProper ...

  4. 【Java虚拟机1】Java字节码文件格式入门

    第一次学习看字节码文件,这个对工作没什么用,但是会提升内功. 首先介绍两个IDEA插件以及使用: BinEd:以16进制格式查看class文件 使用方法:右键class文件,点击Open as bin ...

  5. Java:HashMap类小记

    Java:HashMap类小记 对 Java 中的 HashMap类,做一个微不足道的小小小小记 概述 HashMap:存储数据采用的哈希表结构,元素的存取顺序不能保证一致.由于要保证键的唯一.不重复 ...

  6. Java:ThreadLocal小记

    Java:ThreadLocal小记 说明:这是看了 bilibili 上 黑马程序员 的课程 java基础教程由浅入深全面解析threadlocal 后做的笔记 内容 ThreadLocal 介绍 ...

  7. 计算机网络:HTTP

    计算机网络基础:HTTP 先验知识 HTTP和其他协议的关系 通过下图,了解IP协议,TCP协议,DNS服务在使用HTTP协议通信过程中各自发挥的作用: 服务器处理流程 接受客户端连接 ------& ...

  8. BUAA 2020 软件工程 结对项目作业

    Author: 17373051 郭骏 3.28添加:4.计算模块接口的设计与实现过程部分,PairCore实现的细节 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) ...

  9. 搬运1:关于对C语言中数组名取地址加减等操作的一点探究

    对于数组名取地址强制转换的操作 偶然在晚上学了C语言指针后网页闲逛找题时,被一个数组名取地址搞糊涂了,在自己试验加探索后我稍微悟了一点东西. 代码如下: #include<stdio.h> ...

  10. 热身训练1 ping ping ping

    点此进入 题意: 一棵树,n+1 个节点,以0号节点为根,给出端点(a,b),节点a到节点b的路径上,至少有一个点是"坏掉的",求"坏掉的点"最少 分析: St ...