【Codeforces Round 328 (Div 2)C】【lcm 讨论题】The Big Race [1,l]长度距离比赛的平局概率

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<math.h>
#include<iostream>
#include<string>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre(){freopen("c://test//input.in","r",stdin);freopen("c://test//output.out","w",stdout);}
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
#define MP(x,y) make_pair(x,y)
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T> inline void gmax(T &a,T b){if(b>a)a=b;}
template <class T> inline void gmin(T &a,T b){if(b<a)a=b;}
const int N=0,M=0,Z=1e9+7,ms63=1061109567;
LL l,a,b;
LL x;
LL gcd(LL x,LL y)
{
	return y==0?x:gcd(y,x%y);
}
int main()
{
	while(~scanf("%lld%lld%lld",&l,&a,&b))
	{
		LL g=gcd(a,b);
		double lcm_=a/g*(double)b;
		if(lcm_>6e18)x=min(l,min(a,b)-1);
		else
		{
			LL lcm=a/g*b;
			LL num=l/lcm;
			x=num*min(a,b);
			LL top=num*lcm;
			LL over=l-top;
			x+=min(over,min(a,b)-1);
		}
		g=gcd(x,l);
		printf("%lld/%lld\n",x/g,l/g);
	}
	return 0;
}
/*
【题意】
有两个机器人A与B赛跑。
两个机器人的均速都为1m/s
然而第一个机器人是每隔a时间单位前进a米,
第二个机器人是每隔b时间单位前进b米。
我们的比赛距离是[1,l]之间的正整数
1<=l,a,b<=5e18
现在问你,对于这[1,l]共计l个比赛距离中,两个人不打成平手的概率是多少

【类型】
讨论
lcm

【分析】
首先,对于lcm(a,b)和其倍数,这些multiple位置上,两只机器人一定是打平的。
对于每个multiple+[0,min(a,b)-1]的位置上,两只机器人也一定是打平的。
于是我们就求合法范围内所有multiple+[0,min(a,b)-1]的格点数即可。

然而要注意
1,lcm可能求出会爆int,这种情况下认为只有一个multiple
2,对于最大的一个multiple,multiple+[0,min(a,b)-1]要保证不溢出l的范围

【时间复杂度&&优化】
Olog(l)

【数据】
123456789012345679 123456789012345679 123456789012345678

6 1 7
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值