[UPC](3025)Fleecing the Raffle ---- 組合數學+概率
阿新 • • 發佈:2018-12-14
做法:
- 概率論學的比較好的話,應該可以直接寫出公式。
- 但自己是根據樣例,試著推了推,也能寫出公式。你會發現,放入x張紙,你寫出來的當前的概率公式分子連乘和分母連乘後都是一樣一樣的。
- 即 (n!)/(n-p+1)! * (n+x-p)!/(n+x)!
- 我們從1~n列舉這個公式,找最大值即可。
- 該題會卡精度,所以使用gamma函式優化階乘運算,防止溢位,即將乘法改為對數的加法
AC程式碼:
//#include<bits/stdc++.h> #include <iostream> #include <string> #include <cstring> #include <cmath> #include <cstdio> #include <algorithm> #define IO ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define pb(x) push_back(x) #define sz(x) (int)(x).size() #define sc(x) scanf("%d",&x) #define abs(x) ((x)<0 ? -(x) : x) #define all(x) x.begin(),x.end() #define mk(x,y) make_pair(x,y #define fin freopen("in.txt","r",stdin) #define fout freopen("out.txt","w",stdout) using namespace std; typedef long long ll; typedef pair<int,int> PII; const int mod = 1e9+7; const double PI = 4*atan(1.0); const int maxm = 1e5+5; const int maxn = 1e6+5; const int INF = 0x3f3f3f3f; int n,p; double cal(int x) { double res = x*exp(lgamma(n+1)+lgamma(n+x-p+1)-lgamma(n-p+1+1)-lgamma(n+x+1)); return res; } int main() { // fin; cin>>n>>p; double ans = -INF; for(int i=1;i<=n;i++) { ans = max(ans,p*cal(i)); } printf("%.8lf\n",ans); return 0; }