hdu 1099 (求期望值,分数求和模拟,gcd,lcm)

6 篇文章 0 订阅
4 篇文章 0 订阅

看了好久题,就是求期望值。

期望呀。。

第一张没拿过的彩票,可能性是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;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值