Gym - 101550F Fleecing the Raffle 公式 + 递推

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;
}

猜你喜欢

转载自blog.csdn.net/qq_40772692/article/details/82965917
今日推荐