hdu 1099 Lottery

38 篇文章 0 订阅

hdu   1099    Lottery           题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1099

题目大意:大概是计算买彩票中奖期望的问题。要想知道具体让你算什么,分析一下样例很容易出。就是让你算一分之N+二分之N+三分之N+……N分之N用带分数形式表示。

题目分析:模拟分数运算,分子分母先分别存,再通过gcd、lcm之类的算,格式好像坑了不少人,稍作注意即可。

code:

#include<stdio.h>
long long gcd(long long a,long long b)
{
    return (b>0)?gcd(b,a%b):a;
}
long long rfacd(long long*n,long long len)
{//通分
    long long lcm=*n,i;
    for(i=1;i<len;i++)
    {
        lcm*=n[i]/gcd(lcm,n[i]);
    }
    return lcm;
}
int main()
{
    long long i,j,lcm,n,ints,gdp[30],debt[30],debtsum,bcints;
    while(scanf("%I64d",&n)!=EOF)
    //for(n=1;n<23;n++)
    {
        if(n==1)printf("1\n");
        else if(n==2)printf("3\n");
        else
        {
            ints=n+1;
            for(j=0,i=2;i<n;i++)
            {
                if(n%i)gdp[j]=i,debt[j++]=n;
                else ints+=n/i;
            }
            lcm=rfacd(gdp,j);
            for(debtsum=i=0;i<j;i++)
            {
                debtsum+=lcm/gdp[i]*n;
            }
            ints+=debtsum/lcm;
            debtsum%=lcm;
            long long GCD=gcd(debtsum,lcm);
            debtsum/=GCD;
            lcm/=GCD;
            for(bcints=0,j=ints;j>0;j/=10)
            {
                bcints++;
                putchar(' ');
            }
            printf(" %I64d\n%I64d ",debtsum,ints);
            for(i=lcm;i>0;i/=10)
            {
                putchar('-');
            }
            putchar('\n');
            for(i=0;i<bcints;i++)
            {
                putchar(' ');
            }
            printf(" %lld\n",lcm);
        }
    }
    return 0;
}
/*
1
3
  1
5 -
  2
  1
8 -
  3
   5
11 --
   12
   7
14 --
   10
   3
18 --
   20
   26
21 --
   35
   129
25 ---
   280
   73
29 ---
   252
   551
33 ----
   2520
   551
37 ----
   2310
   9473
41 -----
   27720
   13433
45 -----
   25740
   18581
49 -----
   24024
   4129
54 -----
   45045
   340463
58 ------
   720720
   620743
62 ------
   680680
   1662439
67 -------
   4084080
   3704479
71 -------
   3879876
   408335
76 ------
   739024
   46533
81 ------
   235144
*/

PS:实在智商着技的话暴力输出也可以的呀 偷笑

PSS:我这种做法只能用long long(又遇到以前那种坑跌现象了)……有人只用int也过了,给跪






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值