题目链接:Urn-ball Probabilities! UVA - 10169
题目大意:两个罐子初始时,一个里有一个红球,另一个里有一红一白两个球,每次有放回的从两个罐子里各取一个球,同时再各放入一个白球。输入n表示取n次球。求至少有一次取到两个红球的概率和每次都取到两个红球的概率。由于每次都取到红球的概率很小,因此输出其小数点到第一位非0的小数之间0的个数。
打表记录每个取球数对应的答案。对于第i次取球,1/(i*(i+1))表示该次取到两个红球的概率。用数组p来记录取n次球,每次都不是取到两个红球的概率,最后输出1-p[n]即可。用变量ans记录取n次球都为两个红球的概率,然后用数组cnt记录小数点后0的个数即可。
#include <iostream>
#include <cstdio>
using namespace std;
const int N=1e6;
double p[N+5];
int cnt[N+5];
int main()
{
p[0]=1;
cnt[0]=0;
double ans=1;
for(long long i=1;i<=N;i++)
{
double tem=1.0/(i*(i+1));
ans*=tem;
p[i]=(1-tem)*p[i-1];
cnt[i]=cnt[i-1];
while((int)(ans*10)==0)
cnt[i]++,ans*=10;
}
int n;
while(~scanf("%d",&n))
printf("%lf %d\n",1-p[n],cnt[n]);
return 0;
}