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. python oracle 写文件 多个SQL变量问题

  2. flutter Switch组件 On/off 用于切换一个单一状态

    import 'package:flutter/material.dart'; class SwitchDemo extends StatefulWidget { @override _SwitchD ...

  3. openresty开发系列28--openresty中操作mysql

    openresty开发系列28--openresty中操作mysql Mysql客户端   应用中最常使用的就是数据库了,尤其mysql数据库,那openresty lua如何操作mysql呢?   ...

  4. eclipse中导入spring-boot框架的jar包方法

    如下代码引入了spring-boot的包 package openresty; import java.io.IOException; import java.security.GeneralSecu ...

  5. functools.partial偏函数的使用

    https://docs.python.org/3.6/library/functools.html 从名字可以看出,该函数的作用就是部分使用某个函数,即冻结住某个函数的某些参数,让它们保证为某个值, ...

  6. Spring cloud微服务安全实战-5-1单点登录基本架

    基于微服务架构,前后端分离实现SSO 前后端分离到底是个什么样的架构. 中间不是用Nginx而是用Node JS. node.js在服务端的页面渲染,这样搜索引擎爬虫 来爬的时候 爬的就是html页面 ...

  7. 软件定义网络基础---SDN的产生

  8. JSON 多层对象获取键值

    <html> <script> window.onload = function(){ var json = { "options":{ "nam ...

  9. POJ Corn Fields 状态压缩DP基础题

    题目链接:http://poj.org/problem?id=3254 题目大意(名称什么的可能不一样,不过表达的意思还是一样的): 种玉米 王小二从小学一年级到现在每次考试都是班级倒数第一名,他的爸 ...

  10. 微服务Consul系列之服务注册与服务发现

    在进行服务注册之前先确认集群是否建立,关于服务注册可以看上篇微服务Consul系列之集群搭建的介绍,两种注册方式:一种是注册HTTP API.另一种是通过配置文件定义,下面讲解的是基于后者配置文件定义 ...