Birthday Paradox(生日悖论)(概率)
judge:LightOJ - 1104
vjudge:vjudge
Time limit:2000 ms
Memory limit:32768 kB
OS:Linux
Source:Problem Setter: Jane Alam Jan
描述![vjudge](https://i-blog.csdnimg.cn/blog_migrate/1dfd77d8151841928cc8c3be6a0bf69b.png)
Sometimes some mathematical results are hard to believe. One of the common problems is the birthday paradox. Suppose you are in a party where there are 23 people judge:LightOJ - 1104
vjudge:vjudge
Input
judge:LightOJ - 1104
vjudge:vjudge
Output
judge:LightOJ - 1104
vjudge:vjudge
Sample Input
2
365
669
Sample Output
Case 1: 22
Case 2: 30
题意
很有意思的一道题。
有时有些数学结果很难相信。其中一个常见的问题是生日悖论。假设你在一个有23个人的聚会上,包括你。聚会上至少有两个人过同一个生日的可能性有多大?令人惊讶的是,结果超过了0.5。现在你必须做相反的事情。你已经给出了一年中的天数。记住,你可以在一个不同的星球,例如,在火星,一年是669天长。你必须找到在一个聚会上你必须邀请的最少人数,这样在聚会上至少两个人有相同生日的概率至少是0.5。
输入
输入以整数 T ( T ≤ 20000 ) T(T≤20000) T(T≤20000)开始,表示测试用例的数量。
每种情况下,在一行中包含一个整数 n ( 1 ≤ n ≤ 1 0 5 ) n(1≤n≤10^5) n(1≤n≤105),表示行星一年中的天数。
输出
对于每个案例,打印案例编号和所需结果。
思路
先算出没有人生日相同的概率,拿1减去结果即为有人生日相同的概率。
设一年有n天,聚会有m个人(包括自己)。
列出方程: 1 − C n 1 ⋅ C n − 1 1 ⋯ C n − m + 1 1 n m > = 0.5 1-\frac{C^1_n·C^1_{n-1}\cdots C^1_{n-m+1}}{n^m}>=0.5 1−nmCn1⋅Cn−11⋯Cn−m+11>=0.5
即: n ⋅ ( n − 1 ) ⋯ ( n − m + 1 ) n m < = 0.5 \frac{n·(n-1)\cdots (n-m+1)}{n^m}<=0.5 nmn⋅(n−1)⋯(n−m+1)<=0.5
为了简化运算,把分子分母分别拆开。
n
−
1
n
⋅
n
−
2
n
⋯
n
−
m
+
1
n
<
=
0.5
\frac{n-1}{n}·\frac{n-2}{n}\cdots \frac{n-m+1}{n}<=0.5
nn−1⋅nn−2⋯nn−m+1<=0.5
到这里我相信所有人都会做这道题了。
代码
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <cstring>
#include <cmath>
#define lowbit(a) ((a)&-(a))
#define maxn 100005
#define eps 0.000000001
using namespace std;
typedef long long ll;
int main(){
// freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false);
int T;
cin >> T;
for(int ca = 1; ca <= T; ca++){
int n;
cin >> n;
double p = 1;
int ans = 1;
for(int j = n - 1; j >= 1; j--){
p *= j * 1.0 / n;
if(p - eps <= 0.5) break;
ans++;
}
printf("Case %d: %d\n", ca, ans);
}
return 0;
}