[APIO 2010] [LOJ 3144] 奇怪装置 (数学)
[APIO 2010] [LOJ 3144] 奇怪装置 (数学)
题面
略
分析
考虑t1,t2时刻坐标相同的条件
\]
由第二个式子,可以令\(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);
}
[APIO 2010] [LOJ 3144] 奇怪装置 (数学)的更多相关文章
- 【LOJ#3144】[APIO2019]奇怪装置(数论)
[LOJ#3144][APIO2019]奇怪装置(数论) 题面 LOJ 题解 突然发现\(LOJ\)上有\(APIO\)的题啦,赶快来做一做. 这题是窝考场上切了的题嗷.写完暴力之后再推了推就推出正解 ...
- #3144. 「APIO 2019」奇怪装置
#3144. 「APIO 2019」奇怪装置 题目描述 考古学家发现古代文明留下了一种奇怪的装置.该装置包含两个屏幕,分别显示两个整数 \(x\) 和 \(y\). 经过研究,科学家对该装置得出了一个 ...
- 【LG5444】[APIO2019]奇怪装置
[LG5444][APIO2019]奇怪装置 题面 洛谷 题目大意: 给定\(A,B\),对于\(\forall t\in \mathbb N\),有二元组\((x,y)=((t+\lfloor\fr ...
- 【LOJ #3144】「APIO 2019」奇怪装置
题意: 定义将一个\(t\)如下转换成一个二元组: \[ f(t) = \begin{cases} x = (t + \left\lfloor \frac{t}{B} \right \rfloor) ...
- 「APIO 2019」奇怪装置
题目 考虑推柿子 最开始的想法是如果两个\(t\)在\(mod\ B\)意义下相等,那么只需要比较一下\((t+\left \lfloor \frac{t}{B}\rfloor \right)mod\ ...
- [APIO2019T1]奇怪装置
考古学家发现古代文明留下了一种奇怪的装置.该装置包含两个屏幕,分别显示两个整数x和y.经过研究,科学家对该装置得出了一个结论:该装置是一个特殊的时钟,它从过去的某个时间点开始测量经过的时刻数t,但该装 ...
- 题解-APIO2019奇怪装置
problem loj-3144 题意概要:设函数 \(f(t)\) 的返回值为一个二元组,即 \(f(t)=((t+\lfloor \frac tB\rfloor)\bmod A, t\bmod B ...
- 【BZOJ 1911】【APIO 2010】特别行动队
http://www.lydsy.com/JudgeOnline/problem.php?id=1911 夏令营里斜率优化的例题,我调了一晚上,真是弱啊. 先推公式吧($sum_i$表示$x_1 \d ...
- [bzoj 1911][Apio 2010]特别行动队(斜率优化DP)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1911 分析: 首先可以的到裸的方程f[i]=max{f[j]+a*(Si-Sj)^2+b*(S ...
随机推荐
- “jps”命令的用处?
jps位于jdk的bin目录下,其作用是显示当前系统的java进程情况,及其id号. jps相当于Solaris进程工具ps.不像”pgrep java” 或”ps -ef grep java”,jp ...
- flask-migrate的使用
先安装flask-migrate:pip install flask-migrate 然后见代码: 输入命令生成migrates文件夹 然后可以看到项目下生成文件夹: 然后输入命令: 看到: 总之,模 ...
- computed 与methods , watched 的区别
computed 与watched 的区别: 异步请求 数据变化 使用watched ,计算属性不支持异步 计算一个值的结果 用 computed computed 与methods的区别: comp ...
- js加密php解密(CryptoJS)碰到的坑
今天做了一个功能,需要js传密码到php文件,对js密码 进行判断,为想为这个传输过程进行解密,参考了网上的一个方法(这个方法我只是使用了,并没有太深了解0.0) 首先要引入3个js文件 (在网上可搜 ...
- 【rust】Rust变量绑定(3)
Rust 是一个静态类型语言,这意味着我们需要先确定我们需要的类型. 什么是变量绑定? 将一些值绑定到一个名字上,这样可以在之后使用他们. 如何声明一个绑定? 使用 let 关键字: fn main( ...
- linux使用shell 进行文件数据的读取与排序
题目 shell脚本语言编写一个从键盘输入10名学生(含自己)的姓名. 性别.学号和家庭住址,然后按照学号排序,并将排序后的结果在屏幕上按对齐 的方式打印输出的程序. 代码 读入数据 数据排序(这里用 ...
- Java 内存屏障
内存屏障(Memory Barrier,或有时叫做内存栅栏,Memory Fence)是一种CPU指令,用于控制特定条件下的重排序和内存可见性问题.Java编译器也会根据内存屏障的规则禁止重排序. 内 ...
- plt.imshow()为什么不能显示同时显两张照片
在编程的过程中发现plt.imshow()不能同时显示两张照片,如果有两条plt.imshow()语句处于一前一后的位置,那么程序运行后只会显示后面的图片.如果想让每一张图片都显示出来,需要在每一个p ...
- Oracle And子句
Oracle And子句 作者:初生不惑 Oracle基础 评论:0 条 Oracle技术QQ群:175248146 在本教程中,将学习如何使用Oracle AND运算符来组合两个或更多的布尔表达式. ...
- 《SQL Server 2012 T-SQL基础》读书笔记 - 3.联接查询
Chapter 3 Joins Cross Joins(交叉联接)就是返回两个表的笛卡尔积(m行的表cross join一个n行的表得到一个m * n行的结果),它有两种标准SQL语法,第一种: SE ...