看了好久题,就是求期望值。
期望呀。。
第一张没拿过的彩票,可能性是1
第二张没拿过的,可能性是4/5,就是抽五张,在其中四张拿就可以,期望值是1/(4/5)
第三张,可能性是3/5(不是16/25!!),期望值是/(3/5)
.
所以,反正
最后是求n*(1+1/2+1/3+1/4+.....+1/(n-1)+1/n)
随便模拟做一下,
然后22!这一个数据卡住了,连long long 也过不去
只能重新求了个最小公倍数的模拟做的
#include <iostream>
#include <cstdio>
#include <cmath>
#define ll long long
using namespace std;
int n;
ll gcd(ll a,ll b)//a,b的最大共因数
{
return b ? gcd(b,a%b) : a;
}
ll lcm(ll a,ll b)//a,b的最小公倍数
{
return a/gcd(a,b)*b;
}
int main()
{
while(~scanf("%d",&n))
{
ll num = 0;//numerator
ll den = 1;//denominator
for(int i=1; i<=n; i++)
{
den=lcm(den,i);
}
for(int i=1;i<=n;i++)
{
num=num+den/i;
}
num=num*n;
ll tt=gcd(num,den);
num/=tt;
den/=tt;
ll ans=num/den;
num=num%den;
if(num==0)
{
printf("%d\n",ans);
}
else//下面处理分数输出,也可以再定义一个函数记录整数部分位数
{
ll t=ans;
for(int i=1; t; i++)
{
t/=10;
cout<<" ";
}
cout<<" "<<num<<endl;
cout<<ans<<" ";
t=den;
for(int i=1; t; i++)
{
t/=10;
cout<<"-";
}
cout<<endl;
t=ans;
for(int i=1; t; i++)
{
t/=10;
cout<<" ";
}
cout<<" "<<den<<endl;
}
}
return 0;
}