poj1322 Chocolate 生成函式

2022-05-07 22:42:15 字數 1691 閱讀 9457

一共有\(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小,也減去。如果當...