题目链接:Lottery
n种不同号码的彩票,问至少要买多少张才能集齐
第一次抽:n张中随便抽
第二次,在剩下的n-1张中随便抽
第三次,在剩下的n-2张中随便抽
。。。。。
设x次能成功,则p*x=1,x=1/p
则总的次数为
计算时要通分,防止溢出用long long
最大公约数d=gcd(a,b)
最小公倍数a=a/gcd(a,b)*b
最后的结果要约分,注意输出格式,整数和分数之间有一个空格
#include <iostream>
#include <stdio.h>
using namespace std;
const int maxn=23;
long long common[maxn];
long long gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
long long lcm(int a,int b)
{
return a/gcd(a,b)*b;
}
int getlen(int x)
{
int len=0;
while(x){
len++;
x=x/10;
}
return len;
}
void init()
{
common[0]=1;
for(int i=1;i<=maxn;i++){
common[i]=lcm(common[i-1],i);
}
}
int main()
{
//freopen("in.txt","r",stdin);
int n;
long long fenmu,fenzi,ans1;
init();
while(scanf("%d",&n)!=EOF){
fenzi=0;
fenmu=common[n];
for(int i=1;i<=n;i++){
fenzi+=fenmu/i;
}
fenzi=fenzi*n;
ans1=fenzi/fenmu;
fenzi=fenzi%fenmu;
if(!fenzi){
printf("%d\n",ans1);
}
else{
long long yuefen=gcd(fenmu,fenzi);
fenzi=fenzi/yuefen;
fenmu=fenmu/yuefen;
int len1=getlen(ans1);
int len2=getlen(fenmu);
for(int i=0;i<=len1;i++)printf(" ");
printf("%d",fenzi);
printf("\n%d ",ans1);
for(int i=0;i<len2;i++)printf("-");
printf("\n");
for(int i=0;i<=len1;i++)printf(" ");
printf("%d\n",fenmu);
}
}
return 0;
}