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也过了,给跪