一共有\(c\)種糖果,取\(n\)次,每次取到糖果種類都是等概率的,求有\(m\)種糖果個數為奇數個的概率。
直接概率dp時間複雜度太高,卡常數也不太好卡。
將每次取出來的糖果看成是乙個帶有重複元素的排列,直接計算復合條件的排列數量。
考慮符合條件的最後的序列的考慮egf(指數型生成函式),可得出現次數為偶數次的糖果的生成函式為:
\[f_0(x)=\sum_^\frac}=\frac}
\]出現奇數次的糖果的生成函式為:
\[f_1(x)=\sum_^\frac}=\frac}
\]可以得到最後的答案的生成函式為:
\[f_1^(x)\times f_0^(x)=(\frac})^m\times(\frac})^
\]將\(e^x\)看成是乙個整體,然後兩邊分別二項式展開之後做卷積,然後再將\(e^x\)展開即可得到第\(n\)項係數。
\[\begin
g(x)&=2^\times \sum_^(-1)^i\times e^\times \sum_^\times e^\\
&=2^\times \sum_^\sum_^(-1)^i\times e^\\
&=2^\times \sum_^\sum_^(-1)^i\times \sum_^\frac
\end
\]設第\(n\)項的係數為\(a_n\),最後的答案為:
\[\frac\times n!}
\]垃圾poj
坑點:如果用實數類去計算,中間過程可能會爆精度,特別是中間的快速冪,建議將最後分母的那個\(c^m\)移到係數的快速冪裡面,這樣會讓中間過程的數值小一些。
好像用不了%lf,直接用%f即可。
交c++好像過不了。
/************************************====
* author : ylsoi
* time : 2019.2.1
* problem : chocolate
* e-mail : [email protected]
* ***********************************=*/
#include#include#include#include#include#define rep(i,a,b) for(int i=a,i##_end_=b;i<=i##_end_;++i)
#define drep(i,a,b) for(int i=a,i##_end_=b;i>=i##_end_;--i)
#define debug(x) cout<<#x<<"="const int maxn=1e6+10;
const int maxc=200+10;
int c,n,m;
double c[maxc][maxc],ans;
double qpow(double x,int y)
return ret;
}void init()
}int main()
rep(i,0,m)rep(j,0,c-m)
ans+=(i%2 ? -1 : 1)*c[m][i]*c[c-m][j]*qpow((2*m-2*i+2*j-c)*1.0/c,n);
ans=ans*c[c][m]/qpow(2,c);
printf("%.3f\n",ans);
} return 0;
}
POJ 1322 Chocolate 動態規劃
這題當m n 0的時候要輸出1.000 剛寫的時候預設從第二次開始取了.詳見 include include include include include using namespace std 題意 從乙個擁有無限多的盒子中拿出不同顏色的糖果,拿出任何一種顏色的概率都是1 c 每次拿出來的糖果都...
POJ 1322Chocolate 簡單概率dp
有c種顏色的糖果,你每次可以取乙個糖果放在桌子上,但是一旦桌子上已經有這個顏色的糖果了,那這兩顆糖果都會沒掉,問讓你取n次糖果最後桌子上剩下m個糖果的概率是多少。每種糖果要麼是奇數,要麼沒有 定義f i j f i j f i j 為ii i次後剩下j jj個糖果的概率 f i j f i 1 j ...
POJ 1190 生日蛋糕
生日蛋糕 一道很經典也很基礎的搜尋題目。有題目的條件我們可以得到兩個方程 sum rk rk hk n 和 s sum 2 rk hk r1 r1 首先考慮極端剪枝法。假設前i層體積為t,如果剩下的若干層,每層都去最小可能值,體積仍比n大,則剪去,如果剩下幾層都去最大值,體積仍比n小,也減去。如果當...