洛谷P1291 [SHOI2002] 百事世界杯之旅

题目背景

“……在 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值