1.题意:给你在盒子里n个其他人的名字,p个奖品,你可以添加进去自己的任意张名字,从盒子里抽出p个名字,要求有你一张的最大概率是多少。(一张 一张抽p次不放回 = 一次抽p张)
2.分析:
当我放进去 i 张我的名字,抽中我有一张符合规则的机会是 p(i) = C(i,1) * C(n,p-1) / C(n+i,p) ;
解法 : 暴力循环i,取最大值
问题:n高达1e6 , 直接算很麻烦,没有取模无法使用卢卡斯
解决:
有首项,有递推式,暴力循环取最大即可
3.代码:
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int n,p;
int main()
{
scanf("%d%d",&n,&p);
double pi = 1.0*p/(n+1);
double maxx = pi;
for(double i = 2;i<=1000000;i++){
pi = pi*(n + i - p)*(i/(i-1))*(1/(n + i));
if(pi>maxx)maxx = pi;
else break;
}
printf("%.11lf\n",maxx);
return 0;
}