正题

题目链接:https://www.luogu.com.cn/problem/P5516


题目大意

nnn个字母的一个字符串,每次随机选取两个不同的位置(x,y)(x,y)(x,y)让第xxx个位置的字符变成第yyy个位置的字符。

求期望多少次能够把所有字符变成同一个。


解题思路

因为最终状态很多,所以我们考虑枚举最终状态,我们称之为目标状态。

设pip_ipi​表示目标状态的字符有iii个时,该状态变为最终状态的概率,那么有pi=i(n−i)n(n−1)pi−1+n(n−1)−2i(n−i)n(n−1)+i(n−i)n(n−1)pi+1⇒pi=pi−1+pi+12p_i=\frac{i(n-i)}{n(n-1)}p_{i-1}+\frac{n(n-1)-2i(n-i)}{n(n-1)}+\frac{i(n-i)}{n(n-1)}p_{i+1}\Rightarrow p_i=\frac{p_{i-1}+p_{i+1}}{2}pi​=n(n−1)i(n−i)​pi−1​+n(n−1)n(n−1)−2i(n−i)​+n(n−1)i(n−i)​pi+1​⇒pi​=2pi−1​+pi+1​​
我们观察一下这个式子,其实等价于pi−pi−1=pi+1−pip_i-p_{i-1}=p_{i+1}-p_{i}pi​−pi−1​=pi+1​−pi​表示ppp是一个等差数列,而p0=0,pn=1p_{0}=0,p_{n}=1p0​=0,pn​=1所以pi=inp_i=\frac{i}{n}pi​=ni​

然后设fif_ifi​表示目标状态有iii个且是最终状态的情况下到达最终状态的期望步数,而因为 数学期望=概率×步数 ,和 单次期望=1单次概率\frac{1}{单次概率}单次概率1​

所以我们成功造成一次变化的期望次数是12i(n−i)n(n−1)\frac{1}{\frac{2i(n-i)}{n(n-1)}}n(n−1)2i(n−i)​1​,又因为多和少的概率是相等的,所以有方程
fipi=pin(n−1)2i(n−i)+pi+1fi+1+pi−1fi−12f_ip_i=p_i\frac{n(n-1)}{2i(n-i)}+\frac{p_{i+1}f_{i+1}+p_{i-1}f_{i-1}}{2}fi​pi​=pi​2i(n−i)n(n−1)​+2pi+1​fi+1​+pi−1​fi−1​​
因为知道pi=inp_i=\frac{i}{n}pi​=ni​所以直接带进去解出来就有
fi=n(n−1)2i(n−i)+i−12ifi−1+i+12ifi+1f_i=\frac{n(n-1)}{2i(n-i)}+\frac{i-1}{2i}f_{i-1}+\frac{i+1}{2i}f_{i+1}fi​=2i(n−i)n(n−1)​+2ii−1​fi−1​+2ii+1​fi+1​
换一个方式表达就是
(−i−12ifi−1)+(fi)+(−i+12ifi+1)=n(n−1)2i(n−i)(-\frac{i-1}{2i}f_{i-1})+(f_i)+(-\frac{i+1}{2i}f_{i+1})=\frac{n(n-1)}{2i(n-i)}(−2ii−1​fi−1​)+(fi​)+(−2ii+1​fi+1​)=2i(n−i)n(n−1)​
又有fn=0f_n=0fn​=0
这样问题就变成了n−1n-1n−1个线性方程的方程组,因为每个方程组只有三个元,高斯消元会有大量多余步骤,所以我们直接手动先消掉fi−1f_{i-1}fi−1​再返回来消掉fi+1f_{i+1}fi+1​就好了。

时间复杂度O(n)O(n)O(n)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2100;
int n,num[26];
double f[N],a[N],ans;
char s[N];
int main()
{scanf("%s",s+1);n=strlen(s+1);for(int i=1;i<=n;i++)num[s[i]-'A']++;for(int i=1;i<=n;i++)f[i]=n*(n-1)/(2.0*i*(n-i));a[1]=1;for(int i=1;i<n;i++){double r=-(i+1)/(2.0*i),l=-i/(2.0*(i+1));double k=-l/a[i];f[i+1]+=f[i]*k;a[i+1]=1+k*r;}f[n]=0;for(int i=n-1;i>=1;i--){double r=-(i+1)/(2.0*i);f[i]-=f[i+1]*r,f[i]=f[i]/a[i];}for(int i=0;i<26;i++)ans+=num[i]*f[num[i]]/(double)n;printf("%.1lf\n",ans);
}

P5516-[MtOI2019]小铃的烦恼【期望dp,线性消元】相关推荐

  1. LightOJ 1151 Snakes and Ladders (期望DP + 高斯消元)

    Description 'Snakes and Ladders' or 'Shap-Ludu' is a game commonly played in Bangladesh. The game is ...

  2. ICPC 2005 hangzhou Generator (UVA1358)KMP + 期望DP / 高斯消元

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Generator Weblink https://www.luogu.com.cn/problem/ ...

  3. P4457-[BJOI2018]治疗之雨【期望dp,高斯消元】

    正题 题目链接:https://www.luogu.com.cn/problem/P4457 题目大意 开始一个人最大生命值为nnn,剩余hphphp点生命,然后每个时刻如果生命值没有满那么有1m+1 ...

  4. 【BZOJ1778】[Usaco2010 Hol]Dotp 驱逐猪猡 期望DP+高斯消元

    [BZOJ1778][Usaco2010 Hol]Dotp 驱逐猪猡 Description 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300 ...

  5. 【BZOJ2337】XOR和路径,概率期望DP+高斯消元

    Time:2016.08.27 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 与游走思路有一定相似的地方 对答案的每一位进行判断 通过高斯消元解出每个点到n xor路径为1的概率 ...

  6. BZOJ 1778 Usaco2010 Hol Dotp 驱逐猪猡 期望DP+高斯消元

    题目大意:给定一个无向图,炸弹从1号节点出发,每个时刻有P/Q的概率爆炸,如果某个时刻没有爆炸,就会等概率沿着随机一条出边走到下一个城市,求最终每个城市的爆炸概率 #include <cmath ...

  7. 【BZOJ3640】JC的小苹果 概率DP+高斯消元

    [BZOJ3640]JC的小苹果 Description 让我们继续JC和DZY的故事. "你是我的小丫小苹果,怎么爱你都不嫌多!" "点亮我生命的火,火火火火火!&qu ...

  8. BZOJ 3270: 博物馆 1778: 驱逐猪猡 【概率DP+高斯消元】

    题目描述: 中文题面,不多解释.1778传送门 3270 传送门 (博物馆)题目分析: 也许很多人做概率题的时候都有种虚幻感..感觉莫名其妙就得出一个期望.概率,一知半解... 所以我在这里仔细地剖析 ...

  9. BZOJ 3270: 博物馆 [概率DP 高斯消元]

    http://www.lydsy.com/JudgeOnline/problem.php?id=3270 题意:一张无向图,一开始两人分别在$x$和$y$,每一分钟在点$i$不走的概率为$p[i]$, ...

最新文章

  1. Js + Css的msn式的popup提示窗口的实现
  2. poj-1031-fence(不是我写的,我只是想看着方便)
  3. .net之生成图表的控件(柱状图,曲线图,饼状图) [转]
  4. Python之二叉树的遍历
  5. 卷积神经网络的网络层与参数的解析
  6. oracle学习篇一:sqlplus常用命令
  7. 战神笔记本电脑自带access吗_书评:6本二次元小说,每一本都很有想象力,你都读过吗?...
  8. 情怀再次输给现实!中国式星巴克,如今亏到连租金都交不起
  9. Java面试常问基础知识(持续更新)
  10. java+mysql实现图书管理系统
  11. verilog学习笔记——三段式状态机
  12. Ubuntu安装腾达u12驱动
  13. “磁碟机”病毒详尽分析报告
  14. Android桌面插件系列
  15. LaTex论文排版 | (30) 三线表
  16. win10系统无法打开计算器等应用解决办法
  17. python 英语词典_使用Python的英语词典应用程序
  18. 宝塔 7.9.2 宝塔控制面板绕过 手机绑定认证 绕过官方认证
  19. Java 3DES加密解密(Commons.Codec Base64)
  20. Worthington公司弹性蛋白酶研究:分子特征和应用

热门文章

  1. php上传预览源码,php批量上传五[带预览]-PHP源码
  2. 10玩rust_C++工程师的Rust迁移之路(5)- 继承与组合 - 下
  3. 怎样安装php52-71,CentOS如何安装PHP5和PHP7
  4. 开发物体识别桌、_【课程总结】AR系统开发“秘籍”大揭秘!
  5. linux系统刷分辨率,Linux下设置其分辨率及刷新率
  6. python类和函数_构建程序. Python中的类和函数
  7. 孕妇可以在计算机教室待吗,电脑对孕妇有辐射吗?孕妇使用电脑的注意事项
  8. mysql 左连接 怎么走索引_数据库索引、左连接、右连接、等值连接
  9. linux 用mutex定义一个linkedlist,一个高性能无锁非阻塞链表队列
  10. leetcode59. 螺旋矩阵 II