「SDOI2017」硬币游戏 - KMP,高斯消元
周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利。
大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实在是太单调了。
同学们觉得要加强趣味性,所以要找一个同学扔很多很多次硬币,其他同学记录下正反面情况。
用 表示正面朝上, 用 表示反面朝上,扔很多次硬币后,会得到一个硬币序列。比如 表示第一次正面朝上,后两次反面朝上。
但扔到什么时候停止呢?大家提议,选出 个同学, 每个同学猜一个长度为 的序列,当某一个同学猜的序列在硬币序列中出现时,就不再扔硬币了,并且这个同学胜利。为了保证只有一个同学胜利,同学们猜的 个序列两两不同。
很快,个同学猜好序列,然后进入了紧张而又刺激的扔硬币环节。你想知道,如果硬币正反面朝上的概率相同,每个同学胜利的概率是多少。
题解
哎呀好气呀,又到了团长看着就恶心的概率题辣。。
mmp,我在场上的时候真的是连样例都没有看懂啊。但是概率的题能看懂样例就有鬼啦。。
当时感觉可能是AC自动机上dp什么的。。但是最后这个部分分也没有想出来。。
好吧团长要正儿八经地写题解了。。
设 为到达一个可能的硬币序列 的概率,特别的,若某位同学为 ,或者你乐意叫他张三李四王五都可以,那么 为同学 胜利的概率。
设一个状态 为一个硬币序列,这个硬币序列中的任意子串不会使得任意玩家胜利,那么现在若在 后面接上玩家 的硬币序列,玩家 就可能胜利。
为什么是可能胜利呢?考虑一个玩家 的硬币序列为 TTH
,玩家 的硬币序列为 HTT
这样如果状态 的末尾为 H
那么在后面加上 TT
后玩家 胜利,在这种情况下再加上 H
得到 后面接 硬币序列的情况,若 末尾为 HT
那么加上 T
后玩家 胜利,再接上 TH
后得到要求的合法情况。
这种情况只会出现在玩家 的硬币序列的某个前缀是玩家 硬币序列的某个后缀的情况。
假设只有这两个玩家,那么一个方程是显然的:
尝试把这种情况拓展一下,对于两个任意的玩家 ,计算出所有 的硬币序列的前缀是 的硬币序列的后缀的长度 ,那么由 达到到 的概率应该是:
这个式子可以用 KMP 处理出来。
对于第 个玩家和第 个玩家,我们记上面的式子为
设 为 ,某个玩家 胜利的概率为 ,那么这样可以列出 个方程,第 个方程的形式如下:
但是这样有一个问题,现在已经列出 个方程,但是加上变量 一共有 变量,所以我们需要第 个方程。
由于所有玩家胜利的概率之和是 ,所以第 个方程是显然的:
代码
咸鱼团长第 次学习高斯消元。。
|
Author: Sulfur6
Origin: http://sulfur6.github.io
Link: http://sulfur6.github.io/sdoi2017-game/
本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可