problem

loj-3144

题意概要:设函数 \(f(t)\) 的返回值为一个二元组,即 \(f(t)=((t+\lfloor \frac tB\rfloor)\bmod A, t\bmod B)\),现在给出 \(n\) 个区间,问 \(t\) 在这 \(n\) 个区间中取值时,有多少个不同的 \(f(t)\)。

\(n\leq 10^6,\ l_i,r_i,A,B\leq 10^{18}\),区间互不相交

Solution

一开始没啥想法,\(loj\) 的题面上写了 \(l_i\leq r_i,r_i<l_i+1\)……这不就是说 \(l_i=r_i\) 嘛!暴力 \(O(n)\) 就好了!

实际上是 \(r_i<l_{i+1}\),然后看着 \(5\) 分一档的部分分陷入了沉思……后来直接想正解发现正解比暴力容易……

由于不同的二元组难以考虑,考虑两个二元组相同的情况(即 \(f(t_1)=f(t_2)\))。同时这个二元组中的两个函数中,第二维较为简单,考虑从这一维下手。

由于第二维要相同,所以两个相同二元组一定是 \(f(x)\) 与 \(f(x+kB)\) 形式的,再考虑第一维:

\[x+\lfloor \frac xB\rfloor \equiv x+kB+\lfloor \frac {x+kB}B\rfloor \pmod A\\
x+\lfloor \frac xB\rfloor \equiv x+\lfloor \frac xB\rfloor +kB+k \pmod A\\
k(B+1)\equiv 0\pmod A
\]

又由于满足 \(k(B+1)\equiv 0\pmod A\) 的最小 \(k=\frac A{\gcd\{A,B+1\}}\)

即满足 \(f(x)=f(y)\) 的,一定满足 \(\frac {AB}{\gcd \{A,B+1\}}|(y-x)\)。换种说法,也即 \(x\equiv y\pmod {\frac {AB}{\gcd\{A,B+1\}}}\)。

问题转化为在模 \(\frac {AB}{\gcd\{A,B+1\}}\) 意义下的覆盖区间长度,时间复杂度 \(O(n\log n)\)。

Code

//loj-3144
#include <bits/stdc++.h>
using namespace std;
typedef long long ll; template <typename _tp> inline void read(_tp&x){
char ch=getchar();x=0;while(!isdigit(ch))ch=getchar();
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
} inline ll gcd(ll A, ll B) {return B ? gcd(B, A%B) : A;} const int N = 2001000;
typedef pair <ll,int> pli;
pli a[N];
int n, tot;
ll A, B; int main() {
read(n), read(A),read(B);
ll d = A / gcd(A, B+1);
ll l, r, l0, l1, r0, r1;
bool flg = false;
if(1e18 / B < d) {
for(int i=1;i<=n;++i) {
read(l), read(r);
a[++tot] = pli(l, +1);
a[++tot] = pli(r+1, -1);
}
flg = true;
} else {
d *= B;
for(int i=1;i<=n;++i) {
read(l), l0 = l % d, l1 = l / d;
read(r), r0 = r % d, r1 = r / d;
if(l1 == r1) {
a[++tot] = pli(l0, +1);
a[++tot] = pli(r0+1, -1);
} else if(l1 + 1 == r1) {
a[++tot] = pli(l0, +1);
a[++tot] = pli(0, +1);
a[++tot] = pli(r0+1, -1);
} else return printf("%lld\n", d), 0;
}
} if(!flg) a[++tot] = pli(d, 0);
a[0] = pli(0, 0);
sort(a+1, a+tot+1); int vl = 0;
ll Ans = 0ll;
for(int i=1;i<=tot;++i) {
if(vl) Ans += a[i].first - a[i-1].first;
vl += a[i].second;
}
printf("%lld\n", Ans);
return 0;
}

题解-APIO2019奇怪装置的更多相关文章

  1. 【LOJ#3144】[APIO2019]奇怪装置(数论)

    [LOJ#3144][APIO2019]奇怪装置(数论) 题面 LOJ 题解 突然发现\(LOJ\)上有\(APIO\)的题啦,赶快来做一做. 这题是窝考场上切了的题嗷.写完暴力之后再推了推就推出正解 ...

  2. 【LG5444】[APIO2019]奇怪装置

    [LG5444][APIO2019]奇怪装置 题面 洛谷 题目大意: 给定\(A,B\),对于\(\forall t\in \mathbb N\),有二元组\((x,y)=((t+\lfloor\fr ...

  3. Luogu P5444 [APIO2019]奇怪装置

    题目 这种题目看上去就是有循环节的对吧. 在考场上,一个可行的方式是打表. 现在我们手推一下这个循环节. 记函数\(f(t)=(((t+\lfloor\frac tB\rfloor)\%A),(t\% ...

  4. [APIO2019] 奇怪装置

    $solution:$ 问题其实就是求两个式子的循环节. 钦定 $t\mod B=0$且 $(t\neq 0)$,其 $t$ 为循环节. 则将 $1$ 式拆开得 $\frac{t\times (B+1 ...

  5. P5444 [APIO2019]奇怪装置

    传送门 考虑求出最小的循环节 $G$ 使得 $t,t+G$ 得到的数对是一样的 由 $y \equiv t \mod B$ ,得到 $G$ 一定是 $B$ 的倍数,设 $zB=G$,则 $t,t+zB ...

  6. 洛谷$P5444\ [APIO2019]$奇怪装置 数论

    正解:数论 解题报告: 传送门$QwQ$ 我好像当初考的时候这题爆零了,,,部分分都没想到,,,我真的好菜$kk$ 考虑如果在$t_1,t_2$两个时刻有$x_1=x_2,y_1=y_2$是什么情况$ ...

  7. #3144. 「APIO 2019」奇怪装置

    #3144. 「APIO 2019」奇怪装置 题目描述 考古学家发现古代文明留下了一种奇怪的装置.该装置包含两个屏幕,分别显示两个整数 \(x\) 和 \(y\). 经过研究,科学家对该装置得出了一个 ...

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

    [APIO 2010] [LOJ 3144] 奇怪装置 (数学) 题面 略 分析 考虑t1,t2时刻坐标相同的条件 \[\begin{cases} t_1+\lfloor \frac{t_1}{B} ...

  9. [APIO2019T1]奇怪装置

    考古学家发现古代文明留下了一种奇怪的装置.该装置包含两个屏幕,分别显示两个整数x和y.经过研究,科学家对该装置得出了一个结论:该装置是一个特殊的时钟,它从过去的某个时间点开始测量经过的时刻数t,但该装 ...

随机推荐

  1. 数据结构---哈希表的C语言实现(闭散列)

    原文地址:https://blog.csdn.net/weixin_40331034/article/details/79461705 构造一种存储结构,通过某种函数(hashFunc)使元素的存储位 ...

  2. UML建模——活动图(Activity Diagram)

    活动图概述 •活动图和交互图是UML中对系统动态方面建模的两种主要形式 •交互图强调的是对象到对象的控制流,而活动图则强调的是从活动到活动的控制流 •活动图是一种表述过程基理.业务过程以及工作流的技术 ...

  3. Java之Object对象中的wait()和notifyAll()用法

    用一个例子来说明Object对象中的wait方法和notifyAll方法的使用. 首先定义一个消息类,用于封装数据,以供读写线程进行操作: /** * 消息 * * @author syj */ pu ...

  4. python中的修饰符@的作用

    1.一层修饰符 1)简单版,编译即实现 在一个函数上面添加修饰符 @另一个函数名 的作用是将这个修饰符下面的函数作为该修饰符函数的参数传入,作用可以有比如你想要在函数前面添加记录时间的代码,这样每个函 ...

  5. python的argparse模块parse_known_args()方法的使用

    parse_known_args()方法的用处就是有些时候,你的选项配置可能不会在一个函数或包中调用完成 在很多使用,我们可能会需要根据一些输入的选项,比如在深度学习中,我们可能会根据传入的模型设置- ...

  6. Navigator的使用:

    1.路由直接跳转到下一个页面: Navigator.pushNamed(context,"/login"); 2.跳转的下一个页面,替换当前的页面: Navigator.of(co ...

  7. java.net.NoRouteToHostException: Cannot assign requested address 问题分析(端口被用完的解决方法)

    问题: 错误原因: 由于liunx 分配的客户端连接端口用尽,无法建立socket连接所致,虽然socket正常关闭,但是端口不是立即释放,而是处于 TIME_WAIT 状态,默认等待60s后释放.查 ...

  8. 正则表达式\s空格,\d数字,量词+*?测试

    之前的博文中: 有正则表达式的\b.i.\g,本文再测试了空格数字和量词的匹配.这篇只测试匹配,不替换或其他处理.\s空格:测试实际写空格也能识别,但是不利于看出空了几个空格,可以用\s代表空格.\d ...

  9. SourceTree 免登录跳过初始设置的方法 for Windows

    SourceTree安装包下载地址: 链接: https://pan.baidu.com/s/1rOPQkfNqvLGcIeZNw0aAjw 密码: 42us nodev6.9.0 和git 链接:h ...

  10. 【linux学习笔记四】文件搜索命令

    一 文件搜索 locate //在后台数据库中按文件名搜索 搜索速度更快 locate 文件名 //locate命令所搜索的后台数据库 /var/lib/mlocate //更新数据库 updated ...