[APIO2019] 奇怪装置

本文针对洛谷P5444题目提供了一种解决方案,通过分析t1和t2两时刻相等的条件,推导出循环节长度,并采用区间合并的方法进行求解。

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

https://www.luogu.org/problemnew/show/P5444

考虑t1,t2两时刻相等的条件:t1=t2(mod B);[t1/B]=[t2/B](mod A)

可推得t2-t1=k*A/gcd(A,B+1)*B,所以循环节是A/gcd(A,B+1)*B

然后做区间并,注意要以左端点为关键字排序

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef unsigned long long ll;
struct node
{
    ll l,r;
}p[2000005];
int n,cnt,i;
ll A,B,l,r,w,ans;
bool cmp(node a,node b)
{
    return a.l<b.l;
}
ll gcd(ll a,ll b)
{
    if(!b)
        return a;
    return gcd(b,a%b);
}
int main()
{
    scanf("%d%llu%llu",&n,&A,&B);
    if(A/gcd(A,B+1)>1000000000000500000ll/B)
        w=1000000000000500000ll;
    else
        w=A/gcd(A,B+1)*B;
    while(n--)
    {
        scanf("%llu%llu",&l,&r);
        if(r-l+1>=w)
        {
            printf("%llu",w);
            return 0;
        }
        if(l/w==r/w)
            p[++cnt]=(node){l%w,r%w};
        else
        {
            p[++cnt]=(node){l%w,w-1};
            p[++cnt]=(node){0,r%w};
        }
    }
    sort(p+1,p+1+cnt,cmp);
    for(i=2,l=p[1].l,r=p[1].r;i<=cnt;++i)
    {
        if(p[i].l<=r)
        {
            l=min(l,p[i].l);
            r=max(r,p[i].r);
        }
        else 
        {
            ans+=r-l+1;
            l=p[i].l,r=p[i].r;
        }
    }
    ans+=r-l+1;
    printf("%llu",ans);
    return 0;
}

 

转载于:https://www.cnblogs.com/pthws/p/11212529.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值