週末同學們非常無聊,有人提議,咱們扔硬幣玩吧,誰扔的硬幣正面次數多誰勝利。大家紛紛覺得這個遊戲非常符
合同學們的特色,但只是扔硬幣實在是太單調了。同學們覺得要加強趣味性,所以要找乙個同學扔很多很多次硬幣
,其他同學記錄下正反面情況。用h表示正面朝上,用t表示反面朝上,扔很多次硬幣後,會得到乙個硬幣序列。比
如htt表示第一次正面朝上,後兩次反面朝上。但扔到什麼時候停止呢?大家提議,選出n個同學,每個同學猜乙個
長度為m的序列,當某乙個同學猜的序列在硬幣序列中出現時,就不再扔硬幣了,並且這個同學勝利,為了保證只
有乙個同學勝利,同學們猜的n個序列兩兩不同。很快,n個同學猜好序列,然後進入了緊張而又刺激的扔硬幣環節
。你想知道,如果硬幣正反面朝上的概率相同,每個同學勝利的概率是多少。
這題真是妙啊。
我們首先設第i個同學贏的概率是p[i], 再假設存在乙個很長的串 s , 它沒有和任何串匹配,並且記它出現的概率為p[n+1](雖然它很長但是生成它也是有概率的)。
那麼我們現在就相當於給s後面接一些字元,判斷它是否能匹配上某個串。 接著我們考慮, 假如當前想要匹配的串的某個字首是另外乙個待匹配串的字尾,由於s的最後幾項是未知的,那麼有可能先讓另外乙個串匹配走了。 舉個網上最常見的例子,假如當前要匹配的串a是tth,而另外有乙個串b是htt,那麼從s後面直接接了乙個tth的概率就是1/(2^3),然而這個概率不僅僅包括了tth匹配了的情況,還包括了可能s的末尾是h,加tt把b已經匹配好了剩下一位任選匹配上的概率,還包括了可能s的末尾是ht,加t也把b匹配好了的剩下兩位任選匹配上的概率,即 1/8 * p[n+1] =p[a] + 1/2 p[b] + 1/4 p[b] + ... 省略號為其他與a有衝突的串 。即我們可以得到 0=-1/8 * p[n+1] +p[a] + 1/2 p[b] + 1/4 p[b] + ... 的方程組。n+1個變數,現在已經有了n個方程,再因為必須有乙個贏,所有有p[1]-p[n]的和為1,這樣n+1個變數n+1個方程就可以求解了。
注意這題的0.5^x不要預處理,用math庫的,反正我一直我調了乙個小時。
下附ac**。
// luogu-judger-enable-o2
#include#include#include#include#include#define maxn 305
#define double long double
using namespace std;
const double eps=1e-8;
int n,m,len;
int fail[maxn+maxn];
double mypow[maxn];
char s[maxn][maxn];
char t[maxn+maxn];
double a[maxn][maxn];
void kmp()
double gauss()
}for(int i=n;i>=1;i--)
}}int main()}}
// cerr<<"+1"
a[n+1][i]=1.0;
a[n+1][n+2]=1.0;
n++;
gauss();
for(int i=1;i<=n-1;i++)
printf("%.10lf\n",a[i][n+1]);
}
BZOJ 4820 Sdoi2017 硬幣遊戲
好仙的題目啊,本來是kmp裡的題但最後該用的地方被我用hash艹過去了算了反正這不是這道題的重點 考慮乙個暴力的 o nm 3 的做法,其實就是bzoj 1444 jsoi2009 有趣的遊戲的弱化版,但在這道題中直接上只能得到40pts 我們考慮一下這個方法為什麼不行,其實主要的原因是狀態實在太多...
bzoj 4600 硬幣遊戲 博弈論
反硬幣操作與c無關,只與2和3的指數有關。設sg i j 為2和3的指數分別為i和j時,且前面的硬幣都不可翻時的sg值。然後就可以列舉p,q,對於每乙個p,q,它的sg值為 sg i k q j 的異或和以及sg i j k q 的異或和,求mex。include include include d...
1381硬幣遊戲
基準時間限制 1 秒 空間限制 131072 kb 分值 5 難度 1級演算法題 有乙個簡單但是很有趣的遊戲。在這個遊戲中有乙個硬幣還有一張桌子,這張桌子上有很多平行線 如下圖所示 兩條相鄰平行線之間的距離是1,硬幣的半徑是r,然後我們來拋硬幣到桌子上,拋下之後硬幣有時候會和一些直線相交 相切的情況...