洛谷期中考試的第三題,思維型非常強,其來源就是美國的三門問題,又稱:蒙蒂霍爾問題或山車問題。
三門問題的原型是這樣的:
「假設你正在參加一個游戲節目,你被要求在三扇門中選擇一扇: 其中一扇后面有一輛車;其余兩扇后面則是山羊。 你選擇了一道門,假設是一號門,然后知道門后面有什么的主持人, 開啟了另一扇后面有山羊的門,假設是三號門。 他然后問你:“你想選擇二號門嗎?”轉換你的選擇對你來說是一種優勢嗎?」
如果是按照人的【直覺】的話,肯定是每個門有車的概率都是1/3啊,所以換不換都一樣。
沒錯,我一開始也是這么想的,但是如果是這樣,那為什么還要把這種題放到NOIP的提高組里。實際上,上面的那種【直覺】是錯誤的,完全錯誤的!
再推了一大張打草紙后,發現對於這個問題,每次當主持人告訴你其中的一個錯誤選項后,你做出的覺得必須要換,換對你來說是一種優勢。
我們可以這么開看待這個問題:
1.當前選擇的那個門,有汽車的概率是33%,另外兩個門有汽車的概率是66%。 【到這里沒問題吧,神奇的在下面】
2.主持人告訴你另外兩個門中有一個門沒有汽車,那那個門就可以扔掉了,那剩下的那個門,擁有汽車的概率就66%。【是不是?是不是這樣看,轉換是有優勢的!】
接下來,對於該問題進行推廣,推廣到OI中:
題目描述
Bob 正在考試,他遇到了一個奇怪的選擇題:這個選擇題共有 n個選項,其中只有一個選項是正確的。他完全不會做這題,所以只能靠蒙。
蒙這道題分為 n−2n輪,在第 1 輪開始之前,Bob 會在這 n 個選項中隨機蒙一項,之后的每輪流程如下:首先,Alice 會過來幫他排除一個選項,由於 Alice 事先知道答案,所以她會在現有的除正確的那一項和 Bob 正在選的那一項外的選項里,隨機刪去一個。之后,Bob 可以選擇是否更換自己蒙的選項,如果更換,則隨機更換到除正在選的那一項之外的任意一項。
Bob 在這 n−2n 輪中,由於和 Alice 達成的神秘協定,需要恰好更換 kkk 次選項。他想知道,如何更換,使得自己蒙對的概率最大,輸出這個概率。為了方便,你需要輸出這個概率的分數形式在模 109+710^9 + 7 意義下的結果。
前k-1次更換選項,最后1次更換選項的機會要留到最后。可以推出遞歸式,然后解答即可。
代碼實現:
#include <bits/stdc++.h> using namespace std; const int MAXN = 100005; const int MOD = (int)1e9 + 7; int fexp(int a, int b) { int res = 1; for(int i = 1; i <= b; i <<= 1) { if(i & b) res = 1LL * res * a % MOD; a = 1LL * a * a % MOD; } return res; } int inv(int x) { return fexp(x, MOD - 2); } int f[MAXN], g[MAXN]; int main() { int n, k; scanf("%d %d", &n, &k); if(k == 0) { printf("%lld\n", 1LL * inv(n) % MOD); } else if(k == 1) { printf("%lld\n", 1LL * (n - 1) * inv(n) % MOD); } else { puts("GG"); } return 0; }