codeforces1055C. Lucky Days

本文解析了CodeForces竞赛中一道关于数论与区间覆盖的题目,详细介绍了如何利用最大公约数(GCD)来确定可移动的最大长度,并通过调整区间以最大化重叠部分的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

题目链接:

http://codeforces.com/contest/1055/problem/C
竟然被这道题卡住了T_T

其实就是能移动gcd(ta,tb)的长度,然后尽量使他们对齐就行了
然后不一定刚好对齐,所以在不多出一点和多出一点这两种情况中选最大就行了

#include"bits/stdc++.h"
using namespace std;
typedef long long LL;
const int maxn=1e5+5;
const int MOD=1e9+7;
LL f(LL l1,LL r1,LL l2,LL r2)
{
	return max(0LL,min(r1,r2)-max(l1,l2)+1);
}
int main()
{
	LL la,ra,ta,lb,rb,tb;
	while(cin>>la>>ra>>ta>>lb>>rb>>tb)
	{
		la++,ra++,lb++,rb++;
		LL d=__gcd(ta,tb);
		LL ans=0;
		if(rb==ra)ans=f(la,ra,lb,rb);
		else if(ra<rb)
		{
			LL t=(rb-ra)/d;
			la+=t*d;
			ra+=t*d;
			//不一定刚好对齐,所以在不多出一点和多出一点选最大 
			ans=f(la,ra,lb,rb); 
			ans=max(ans,f(la+d,ra+d,lb,rb));
		}
		else if(ra>rb)
		{
			LL t=(ra-rb)/d;
			lb+=t*d;
			rb+=t*d;
			ans=f(la,ra,lb,rb);
			ans=max(ans,f(la,ra,lb+d,rb+d));
		}
		cout<<ans<<endl;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值