枚举最终所有牌的大小$i$,对于最终所有牌大小都为$i$的情况,令其贡献为步数,否则令其贡献为0,记$F$为期望贡献(即所有情况概率*贡献之和),答案即为$\sum_{i=1}^{m}F$

显然,$F$仅取决于牌的数量,定义$F_{i}$表示恰有$i$张牌的期望贡献,那么答案即为$\sum_{i=1}^{m}F_{a_{i}}$

在求$F_{i}$的转移之前,先定义$P_{i}$为贡献为步数的情况的概率,关于$P_{i}$的转移,不难得到
$$
\begin{cases}P_{0}=0,P_{n}=1\\P_{i}=\frac{P_{i-1}+P_{i+1}}{2}&(1\le i<n)\end{cases}
$$
这是一个经典的问题,通项为$P_{i}=\frac{i}{n}$

考虑$F_{i}$的转移,即为
$$
\begin{cases}F_{0}=F_{n}=0\\F_{i}=\frac{i(n-i)}{n(n-1)}(F_{i-1}+F_{i+1}+\frac{2i}{n})+(1-\frac{2i(n-i)}{n(n-1)})(F_{i}+\frac{i}{n})&(1\le i<n)\end{cases}
$$
(注意每一次步数并不是+1,而是加上目标状态的$P_{i}$,因为只有$P_{i}$的概率这步有贡献)

将其化简,即为
$$
\begin{cases}F_{0}=F_{n}=0\\F_{i+1}=2F_{i}-F_{i-1}-\frac{n-1}{n-i}&(1\le i<n)\end{cases}
$$
将其差分,即令$G_{i}=F_{i+1}-F_{i}$,那么
$$
\begin{cases}G_{0}=F_{1},\sum_{i=0}^{n-1}G_{i}=0\\G_{i}=G_{i-1}-\frac{n-1}{n-i}&(1\le i<n)\end{cases}
$$
将第2个式子不断迭代,即可得$G_{i}=F_{1}-\sum_{j=1}^{i}\frac{n-1}{n-j}$,那么
$$
\sum_{i=0}^{n-1}G_{i}=nF_{1}-\sum_{i=0}^{n-1}\sum_{j=1}^{i}\frac{n-1}{n-j}=nF_{1}-\sum_{j=1}^{n-1}\frac{n-1}{n-j}(n-j)=nF_{1}-(n-1)^{2}=0
$$
解得$F_{1}=\frac{(n-1)^{2}}{n}$,进而可得
$$
F_{i}=\sum_{j=0}^{i-1}G_{j}=iF_{1}-\sum_{j=1}^{i-1}\frac{n-1}{n-j}(i-j)=\frac{i(n-1)^{2}}{n}-(i-1)(n-1)+(n-i)(n-1)\sum_{j=n-i+1}^{n-1}\frac{1}{j}
$$
(最后一个变化是将$i-j$变形为$(n-j)-(n-i)$,再根据分配律展开即可)

关于最后一项,令$H_{n}=\sum_{i=1}^{n}\frac{1}{i}$,即$H_{n}-H_{n-i}$,关于$H_{n}$为调和级数,用$H_{n}=\ln n+C$来模拟即可(较小范围预处理,$C$使用0.5772即可,当然还可以分块打表)

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 10000005
4 #define C 0.5772
5 #define ld long double
6 int n,m,x;
7 ld nn,ans,h[N];
8 ld H(int n){
9 if (n<N)return h[n];
10 return log(n)+C;
11 }
12 ld calc(int k){
13 return k*(nn-1)*(nn-1)/nn-(k-1)*(nn-1)+(nn-k)*(nn-1)*(H(n-1)-H(n-k));
14 }
15 int main(){
16 for(int i=1;i<N;i++)h[i]=h[i-1]+(ld)1/i;
17 scanf("%d%d",&n,&m);
18 nn=n;
19 for(int i=1;i<=m;i++){
20 scanf("%d",&x);
21 ans+=calc(x);
22 }
23 printf("%.7Lf",ans);
24 }

[loj6118]鬼牌的更多相关文章

  1. LOJ#6118 鬼牌

    \(\rm upd\):是我假了...这题没有爆精...大家要记得这道题是相对误差\(10^{-6}\)...感谢@foreverlasting的指正. 题是好题,可是标算爆精是怎么回事...要写的和 ...

  2. UOJ147 斗地主

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关 系根据牌的数码表示如下:3<4&l ...

  3. UOJ 151 斗地主“加强”版

    #151. [NOIP2015]斗地主“加强”版 统计 描述 提交 自定义测试 本题开放Hack 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54 ...

  4. FZU 2216 The Longest Straight(最长直道)

    Description 题目描述 ZB is playing a card game where the goal is to make straights. Each card in the dec ...

  5. Pandas python

    原文:  https://github.com/catalystfrank/Python4DataScience.CH   和大熊猫们(Pandas)一起游戏吧!   Pandas是Python的一个 ...

  6. Python数据分析入门之pandas基础总结

    Pandas--"大熊猫"基础 Series Series: pandas的长枪(数据表中的一列或一行,观测向量,一维数组...) Series1 = pd.Series(np.r ...

  7. 扑克牌(cards)

    扑克牌 思路 这题也是二分!! 我们二分有几套牌,然后再去检验是否符合,至于怎么想到的,不要问我,我也不知道 那么我们主要解决的就是check函数 我们将二分的套数和每种牌的数量进行比较,如果该种牌的 ...

  8. Codeforces 1392H - ZS Shuffles Cards(DP+打表找规律)

    Codeforces 题面传送门 & 洛谷题面传送门 真·两天前刚做过这场的 I 题,今天模拟赛就考了这场的 H 题,我怕不是预言带师 提供一种奇怪的做法,来自于同机房神仙们,该做法不需要 M ...

  9. Solution -「CF 1392H」ZS Shuffles Cards

    \(\mathcal{Description}\)   Link.   打乱的 \(n\) 张编号 \(1\sim n\) 的数字排和 \(m\) 张鬼牌.随机抽牌,若抽到数字,将数字加入集合 \(S ...

随机推荐

  1. Zookeeper 集群部署的那些事儿

    简介 额...., &*$% 淘气! ZooKeeper 是 Apache 的一个顶级项目,为分布式应用提供高效.高可用的分布式协调服务. ZooKeeper本质上是一个分布式的小文件存储系统 ...

  2. 洛谷4299首都(LCT维护动态重心+子树信息)

    这个题目很有意思 QWQ 根据题目描述,我们可以知道,首都就是所谓的树的重心,那么我们假设每颗树的重心都是\(root\)的话,对于每次询问,我们只需要\(findroot(x)\)就可以. 那么如何 ...

  3. Flutter随笔(二)——使用Flutter Web + Docker + Nginx打造一个简单的Web项目

    前言 Flutter作为一个跨平台UI框架,功能十分强大,仅用一套代码便能编译出Android.iOS.Web.windows.macOS.Windows.Linux等平台上的应用,各平台应用体验高度 ...

  4. SpringBoot打包到docker(idea+传统方式)

    作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 目录 1. 方式1.通过idea 远程发布 1.1 修改docker.service文件 1. 进入服务器 2. 修改ExecStart行为下面内容 ...

  5. 分库分表利器之Sharding Sphere(深度好文,看过的人都说好)

    Sharding-Sphere Sharding-JDBC 最早是当当网内部使用的一款分库分表框架,到2017年的时候才开始对外开源,这几年在大量社区贡献者的不断迭代下,功能也逐渐完善,现已更名为 S ...

  6. 【UE4 C++】UGameplayStatics 源代码

    // Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" # ...

  7. 《手把手教你》系列技巧篇(三十四)-java+ selenium自动化测试-单选和多选按钮操作-中篇(详解教程)

    1.简介 今天这一篇宏哥主要是讲解一下,如何使用list容器来遍历单选按钮.大致两部分内容:一部分是宏哥在本地弄的一个小demo,另一部分,宏哥是利用JQueryUI网站里的单选按钮进行实战. 2.d ...

  8. .Net 5下的单文件部署

    由于.net程序没有静态链接,一直缺乏单文件部署这种干净的发布方案.对客户端程序发布并不是很友好.在之前的.net framework下,有ILMerge合并程序集,以及LibZ的嵌入资源文件等第三方 ...

  9. Beta_Scrum Meeting_0

    日期:2021年5月26日 参会人员:cy.hcc.lsc.dxh 会议主题:为Beta阶段最早两日的开发制定目标 一.进度情况 组员 负责 两日内完成的任务 接下来两日预计完成的任务 hcc 前端 ...

  10. 写一段java程序来执行linux命令

    摘要 在日常开发中,程序员需要经常查询服务器日志来排查问题和调试程序.如果是本地调试还好,但项目一旦发布到服务器上,每次查日志就很麻烦,而且日志量巨大,有时我们无法找到我们需要的信息.经常需要借助第三 ...