題意:
乙個m邊形的骰子,求連續投出n個相同的面,和m個兩兩不同的面的期望次數。
solution:
令\(f_i\)表示已經連續投出i個相同的面,到連續投出n個還需要的期望次數.
令\(g_i\)類似的表示第二種問題的期望次數。
對於\(f_i\) ,有兩種情況:
① 投出了和前i個相同的面,轉移到了\(f_\) ,那麼\(f_i+=(f_+1)*\frac\)
② 投出了乙個不同的面,轉移到了\(f_1\),那麼\(f_i+=(f_1+1)*\frac\)
綜上,\(f_i=(f_+1)*\frac+(f_1+1)*\frac=f_*\frac+f_1*\frac+1\)
同理的話有:\(m*f_=m+(m-1)*f_1+f_\)
兩式相減得到:\(m*(f_-f_i)=f_-f_\)
可以發現,這成乙個等比數列:
\[f_0-f_1=1\\
f_1-f_2=m\\
…\\f_-f_n=m^
\]運用等比數列求和公式可得:\(ans=\frac)}+1\) 。
對於\(g_i\):
① 投出了和前i個都不同的面,轉移到了\(g_\) ,那麼\(g_i+=(g_+1)*\frac\)
② 投出了以前出現過的面,那麼可能轉移到了\(g_1,g_2,…g_i\),那麼\(g_i+=\sum_}\)
綜上,\(g_i=(g_+1)*\frac+\sum_}=g_*\frac+\frac*\sum_+1\)
同上面\(f_i\)類似的處理之後,可以同樣的得到\(g_i-g_=\frac*(g_-g_)\),直接遞推一下即可。
code:
#include#include#include#include#include#define rg register
#define il inline
#define ll long long
#define db double
using namespace std;
const int n=1e6+1;
int n,m;
db ans,s[n];
il int qpow(int x,int p)
int main()
} }return 0;
}
ACdream1139 Sum 推公式 逆元求解
題意 給定乙個由0 9組成的矩陣,我們求行相鄰的組成的數與列相鄰的組成的數的和。eg 第一行組成的數有 1,2,3,12,23,123 第一列組成的數有 1,4,7,12,47,147.暴力列舉所有的數肯定是不可取的,我們試著總結。我們發現a x y 在行裡出現的數對以後和的貢獻為 x a x y ...
(概率DP)正向推概率,反向推期望
這個思想真是太經典了!為什麼要正向推概率,反向推期望呢?事件a在另外乙個事件b已經發生條件下的發生概率。條件概率表示為p a b 讀作 在b條件下a的概率 然後,我們再看看什麼是貝葉斯公式。算了,我就不扯了,自己點進去看吧。現在,正文來了。拿飛行棋來說,可以先看看hdu 4405 aeroplane...
字尾和 推公式
題意 n個數,分為k組,每組的數字的下標是連續的,則分組的代價為 組號 數字 例如3個數1,2,3,分為2組,這麼分組的代價為1 1 1 2 2 3。n,k 3e5。題解 1.假設pi是第i組的第1個數字的下標,sum i 是第i個數到第n個數求和。那麼分組的代價為1 sum p1 sum p2 2...