「APIO2019」奇怪装置
Problem
Solution
至高无上的xxx250说这道题有循环节,且观察样例可大胆猜测周期一定是的因数。
题目要求求这一坨玩意:
设循环节为,因为时,,所以,
即
因为 所以式子中的向下取整可以去掉。于是可化为
所以
式子可化为
移项可得
所以最小循环节为,所以
然后题目所求可以转化为区间覆盖问题。
分类讨论亿一下,区间
若,则答案为
否则,设。将点对映射到数轴上,将其转化为一个线段覆盖问题。(需要分别考虑和的情况)
//最小循环节 + 线段覆盖
#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现