首先我们来看下生日悖论:
假设有n个人,365天的时间,假设所有人生日不相同的概率为(1-P)
第一个人可选择365 天中的任意365天,人数为1时所有人生日不相同的概率为365/365;
第二个人可选择365天中的任意364天,人数为2时所有人生日不相同的概率为(364/365)* (365/365);
...
第n个人选择365中的任意365-n+1天,人数为n时所有人生日不相同的概率为((365-n+1)/365)*...*(364/365)* (365/365)
即 1-P =(365/365)*(364/365)*...*((365-n+1)/365)
一年的天数为n,dp[ i ] 为i 个人生日都不相同的概率;设dp[0]=1;
dp[ i ]= dp[ i-1 ]*( n-i+1)/n; //注意转化为小数
判断概率即可得出结果
代码:
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#define ll long long
using namespace std;
#define inf 0x3f3f3f3f
double dp[110000];
int main()
{
int t,n,i;
scanf("%d",&t);
int op=0;
while(t--)
{
scanf("%d",&n);
dp[0]=1;
for(i=1; i<=n; i++)
{
dp[i]=dp[i-1]*double(n-i+1)/double(n);
if(1-dp[i]>=0.5)
break;
}
printf("Case %d: %d\n",++op,i-1);
}
}