题目背景
“……在 2002 年 6 月之前购买的百事任何饮料的瓶盖上都会有一个百事球星的名字。只要凑齐所有百事球星的名字,就可参加百事世界杯之旅的抽奖活动,获得球星背包,随声听,更可赴日韩观看世界杯。还不赶快行动!”
题目描述
你关上电视,心想:假设有 �n 个不同的球星名字,每个名字出现的概率相同,平均需要买几瓶饮料才能凑齐所有的名字呢?
输入格式
输入只有一行一个整数,表示不同球星名字的个数 �n。
输出格式
输出凑齐所有的名字平均需要买的饮料瓶数。如果是一个整数,则直接输出,否则应该直接按照分数格式输出,例如五又二十分之三应该输出为:
3
5--
20
第一行是分数部分的分子,第二行首先是整数部分,然后是由减号组成的分数线,第三行是分母。减号的个数应等于分母的位数。分子和分母的首位都与第一个减号对齐。
分数必须是不可约的。
输入输出样例
输入 #1复制
2
输出 #1复制
3
输入 #2复制
17
输出 #2复制
340463 58------ 720720
说明/提示
数据规模与约定
对于全部的测试点,保证 2≤n≤33。
上代码:
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
ll f[37],a[37],b[37],n,ans1=0,ans2=1,ans3;
ll gcd(ll x,ll y){
if(x==0){
return y;
}
return gcd(y%x,x);
}
ll lcm(ll x,ll y){
return x/gcd(x,y)*y;
}
ll duliu(ll x){
ll res=0;
while(x){
x=x/10;
res++;
}
return res;
}
int main(){
cin>>n;
for(ll i=1;i<=n;i++){
ll g=gcd(i,n);
a[i]=n/g;
b[i]=i/g;
}
for(ll i=1;i<=n;i++){
ans2=lcm(ans2,b[i]);
}
for(ll i=1;i<=n;i++){
ans1=ans1+ans2/b[i]*a[i];
}
ll g=gcd(ans1,ans2);
ans1=ans1/g;
ans2=ans2/g;
if(ans1%ans2==0){
cout<<ans1/ans2<<endl;
return 0;
}
ans3=ans1/ans2;
ans1=ans1%ans2;
ll duliu3=duliu(ans3);
ll duliu1=duliu(ans2);
for(ll i=1;i<=duliu3;i++){
cout<<" ";
}
cout<<ans1<<endl;
cout<<ans3;
for(ll i=1;i<=duliu1;i++){
cout<<"-";
}
cout<<endl;
for(ll i=1;i<=duliu3;i++){
cout<<" ";
}
cout<<ans2<<endl;
return 0;
}