[APIO 2010] [LOJ 3144] 奇怪装置 (数学)

题面

分析

考虑t1,t2时刻坐标相同的条件

\[\begin{cases} t_1+\lfloor \frac{t_1}{B} \rfloor \equiv t_2+\lfloor \frac{t_2}{B} \rfloor (\mathrm{mod}\ A) \\ t_1 \equiv t_2 (\mathrm{mod}\ B)\\ \end{cases}
\]

由第二个式子,可以令\(t_1=t_2+Bk(k \in N)\)

代入式子1,\(t_2+Bk+\lfloor \frac{t_2}{B}+k \rfloor \equiv t_2+\lfloor \frac{t_2}{B} \rfloor(\mathrm{mod} \ A)\)

消元得\((B+1)k \equiv 0 (\mathrm{mod} \ A)\)

因此\(k|\frac{A}{gcd(A,B+1)}\),

代入上式,\(t_1=t_2+B\frac{A}{gcd(A,B+1)}(k \in N)\)

\(t_1 \equiv t _2 \ (\mathrm{mod} \frac{AB}{gcd(A,B+1)})\)

因此,可以把l,r取模\(\frac{AB}{gcd(A,B+1)}\),然后问题就变成在\([0,\frac{AB}{gcd(A,B+1)}]\)上有若干条线段,求线段的并

直接排序再\(O(n)\)扫一遍即可

注意\(\frac{AB}{gcd(A,B+1)}\)可能会超过long long范围,但注意到l,r都\(\leq 2 \times 10^{18}\),如果\(\frac{AB}{gcd(A,B+1)}\)超过就强行设成$ 2 \times 10^{18}$

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 1000000
#define maxr 2e18
using namespace std;
typedef long long ll;
ll n,A,B;
inline ll gcd(ll a,ll b){
return b==0?a:gcd(b,a%b);
} struct seg{
ll l;
ll r;
seg(){ }
seg(ll _l,ll _r){
l=_l;
r=_r;
}
friend bool operator < (seg p,seg q){
if(p.l==q.l) return p.r<q.r;
else return p.l<q.l;
}
}a[maxn+5],b[maxn*2+5];
int cnt=0;
int main(){
scanf("%I64d %I64d %I64d",&n,&A,&B);
for(int i=1;i<=n;i++){
scanf("%I64d %I64d",&a[i].l,&a[i].r);
}
ll C=A/gcd(A,B+1);
if(maxr/B<=C) C=maxr; //B*C<=2e18
else C=C*B;
for(int i=1;i<=n;i++){
if(a[i].r-a[i].l>=C){
printf("%I64d\n",C);
return 0;
}
if(a[i].l%C<=a[i].r%C){
b[++cnt]=seg(a[i].l%C,a[i].r%C);
}else{
b[++cnt]=seg(0,a[i].r%C);
b[++cnt]=seg(a[i].l%C,C-1);
}
}
sort(b+1,b+1+cnt);
// cnt=unique(b+1,b+1+cnt)-b-1;
ll l=b[1].l,r=b[1].r;
ll ans=0;
for(int i=2;i<=cnt;i++){
if(b[i].l>r+1){
ans+=(r-l+1);
l=b[i].l;
r=b[i].r;
}else if(b[i].r>r){
r=b[i].r;
}
}
ans+=r-l+1;
printf("%I64d\n",ans);
}

最新文章

  1. WPF 自定义窗口
  2. geotrellis使用初探
  3. PHPCMS几个有用的全局函数
  4. 获取 苹果UDID 序列号
  5. python成长之路【第七篇】:面向对象
  6. c++垃圾回收代码练习 引用计数
  7. PPTP VPN 一键安装包(图文,OpenVZ适用)[zz]
  8. 【ASP.NET Web API教程】6.1 媒体格式化器
  9. WebRTC学习资料大全
  10. uva 11922 Permutation Transforme/splay tree
  11. ios NavBar+TarBar技巧
  12. jquery和js cookie的使用解析
  13. Sublime Text 3 最性感的编辑历史
  14. Hibernate一个简短的引论
  15. JAVA中类以及成员变量和成员方法的修饰符的总结
  16. docker中管理数据
  17. C++框架_之Qt的窗口部件系统的详解-上
  18. shell测试命令test、[ ]、[[ ]]
  19. Linux下修改IP、DNS、路由命令行设置
  20. Python自动化开发 - 网络编程

热门文章

  1. bzoj5099 [POI2018]Pionek 双指针
  2. windows javaee 安装
  3. 前端之JQuery:JQuery属性操作
  4. 【leetcode】Smallest Rotation with Highest Score
  5. ARC模式下delloc()注意事项
  6. Java——面向对象编程
  7. window 下 Atom 侧边栏字体大小设置
  8. Java关于Files. walkFileTree()
  9. [转]玩转Google开源C++单元测试框架Google Test系列(gtest)(总)
  10. React-Native 之 GD (六)无数据情况处理