「APIO2019」奇怪装置

Problem

传送门:左转 右转

Solution

至高无上的xxx250说这道题有循环节,且观察样例可大胆猜测周期一定是AB的因数。

题目要求求这一坨玩意:

{x=((t+tB) modAy=(t modB)

设循环节为k,因为t=0时,{x=0y=0,所以,{x=((k+kB) modA)=0y=(k modB)=0

{0=(k+kB) modA0=(k modB)

因为0=(k modB) 所以式子中的向下取整可以去掉。0=(k+kB) modA于是可化为0=k(B+1)B modA

所以0k(B+1)B modA

式子可化为0kB (mod Agcd(A,B+1))
移项可得0k (mod ABgcd(A,B+1))

所以最小循环节为k(mod ABgcd(A,B+1))=0,所以k=ABgcd(A,B+1)

然后题目所求可以转化为区间覆盖问题。

分类讨论亿一下,区间[l,r]

krl+1,则答案为k

否则,设L=lmodk,R=rmodk。将点对映射到数轴上,将其转化为一个线段覆盖问题。(需要分别考虑LRL>R的情况)

code:

//最小循环节 + 线段覆盖
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

const int MAX_N = 1000000 + 5;

int n,m;
ll A,B,k,ans;
struct node{
    ll l,r;
}s[MAX_N];
inline bool cmp(node a,node b){
    return a.l<b.l;
}
int main(){
    scanf("%d%lld%lld",&n,&A,&B);
    k=A/__gcd(A,B+1)*B;
    if(k<0) k=2e18;
    for(int i=1;i<=n;++i){
        ll l,r;
        scanf("%lld%lld",&l,&r);
        if(r-l+1>=k){
            ans=k;
            continue;
        }
        else{
            l%=k,r%=k;
            if(l>r) s[++m]=(node){0,r},s[++m]=(node){l,k-1};
            else s[++m]=(node){l,r};
        }
    }
    if(ans){
        printf("%lld\n",ans);
        return 0;
    }
    sort(s+1,s+1+m,cmp);
    ans=0;
    ll L=s[1].l,R=s[1].r;
    s[++m]=(node){k,k};
    for(int i=2;i<=m;++i){
        if(R<s[i].l){
            ans+=R-L+1;
            L=s[i].l,R=s[i].r;
        }
        else{
            R=max(s[i].r,R);
        }
    }
    printf("%lld\n",ans);
    return 0;
}
posted @   Thermalrays  阅读(57)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示