题意:

定义将一个\(t\)如下转换成一个二元组:

\[f(t) =
\begin{cases}
x = (t + \left\lfloor \frac{t}{B} \right \rfloor) \bmod A\\
y = t \bmod b
\end{cases}
\]

询问\([l_i, r_i]\)之间的\(t_i\)能够转换成多少个本质不同的二元组。

思路:

考虑\((x_1, y_1)\)和\((x_2, y_2)\)相同的时候:

\[\begin{cases}
t_1 + \left\lfloor \frac{t_1}{B} \right\rfloor &\equiv& t_2 + \left \lfloor \frac{t_2}{B} \right\rfloor \bmod A \\
t_1 &\equiv& t_2 \bmod B
\end{cases}
\]

我们不妨令\(t_1 = t_2 + kB\),代入第一个式子有:

\[\begin{eqnarray*}
t_2 + kB + \left\lfloor \frac{t_2 + kB}{B} \right \rfloor \equiv t_2 + \left \lfloor \frac{t_2}{B} \right \rfloor \bmod A
\end{eqnarray*}
\]

化简之后有:

\[\begin{eqnarray*}
k(B + 1) \equiv 0 \bmod A
\end{eqnarray*}
\]

所以有\(A\;|\;k(B + 1)\),继而有\(\frac{A}{gcd(A, B + 1)}\;|\;k\),令\(g = \frac{A}{gcd(A, B + 1)}\),那么有\(g\;|\;k\)。

所以\(k\)要满足是\(g\)的倍数上述条件才成立,而\(t_1\)模\(B\)的个数是\(B\)个,所以循环节长度为\(T = gB\)。

将区间取模之后变成一条条线段,差分得到\([0, T)\)的覆盖区间长度即为答案。

代码:

#include <bits/stdc++.h>
using namespace std; #define ll long long
#define N 1000010
#define pll pair <ll, ll>
#define fi first
#define se second
int n;
ll l[N], r[N];
ll A, B;
ll gcd(ll a, ll b) {
return b ? gcd(b, a % b) : a;
} multiset <pll> se;
void add(ll l, ll r) {
se.insert(pll(l, 1));
se.insert(pll(r + 1, -1));
} int main() {
while (scanf("%d%lld%lld", &n, &A, &B) != EOF) {
se.clear();
ll sum = 0;
for (int i = 1; i <= n; ++i) {
scanf("%lld%lld", l + i, r + i);
sum += r[i] - l[i] + 1;
}
ll g = gcd(A, B + 1);
if (1.0 * A * B / g > 1e18) {
printf("%lld\n", sum);
continue;
}
ll T = A / g * B;
for (int i = 1; i <= n; ++i) {
if (r[i] - l[i] + 1 >= T) {
printf("%lld\n", T);
return 0;
}
l[i] %= T;
r[i] %= T;
if (l[i] > r[i]) {
add(l[i], T - 1);
add(0, r[i]);
} else {
add(l[i], r[i]);
}
}
ll base = 0, lst = -1, res = 0;
for (auto it : se) {
if (base > 0) res += it.fi - lst;
base += it.se;
lst = it.fi;
}
printf("%lld\n", res);
}
return 0;
}

【LOJ #3144】「APIO 2019」奇怪装置的更多相关文章

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

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

  2. 「APIO 2019」奇怪装置

    题目 考虑推柿子 最开始的想法是如果两个\(t\)在\(mod\ B\)意义下相等,那么只需要比较一下\((t+\left \lfloor \frac{t}{B}\rfloor \right)mod\ ...

  3. LOJ#3054. 「HNOI 2019」鱼

    LOJ#3054. 「HNOI 2019」鱼 https://loj.ac/problem/3054 题意 平面上有n个点,问能组成几个六个点的鱼.(n<=1000) 分析 鱼题,劲啊. 容易想 ...

  4. #3146. 「APIO 2019」路灯

    #3146. 「APIO 2019」路灯 题目描述 一辆自动驾驶的出租车正在 Innopolis 的街道上行驶.该街道上有 \(n + 1\) 个停车站点,它们将街道划分成了 \(n\) 条路段.每一 ...

  5. #3145. 「APIO 2019」桥梁

    #3145. 「APIO 2019」桥梁 题目描述 圣彼得堡市内所有水路长度总和约 282 千米,市内水域面积占城市面积的 7%.--来自维基百科 圣彼得堡位于由 \(m\) 座桥梁连接而成的 \(n ...

  6. 「APIO 2019」桥梁

    题目 三天终于把\(APIO\)做完了 这题还是比较厉害的,如果不知道这是个分块应该就自闭了 考虑一个非常妙的操作,按照操作分块 我们设一个闸值\(S\),把\(S\)个边权修改操作分成一块,把所有的 ...

  7. 「APIO 2019」路灯

    题目 显然一个熟练的选手应该能一眼看出我们需要维护点对的答案 显然在断开或连上某一条边的时候只会对左右两边联通的点产生贡献,这个拿\(set\)维护一下就好了 那现在的问题就是怎么维护了 考虑一个非常 ...

  8. Loj #2495. 「AHOI / HNOI2018」转盘

    Loj #2495. 「AHOI / HNOI2018」转盘 题目描述 一次小 G 和小 H 原本准备去聚餐,但由于太麻烦了于是题面简化如下: 一个转盘上有摆成一圈的 \(n\) 个物品(编号 \(1 ...

  9. Loj #2494. 「AHOI / HNOI2018」寻宝游戏

    Loj #2494. 「AHOI / HNOI2018」寻宝游戏 题目描述 某大学每年都会有一次 Mystery Hunt 的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得 ...

随机推荐

  1. Cortex_m7内核cache深入了解和应用

    一,cache概述 从下图可以看出,从M7内核才开始有的cache,这对于从M0,M3,M4一路走来的小伙伴来说,多了一个cache就多了一个障碍. Cortex-M7 core with 32K/3 ...

  2. Linux命令格式及7个常见终端命令

    Linux命令格式 Linux常见的7个终端命令

  3. leetcode动态规划笔记三---单序列型

    单序列型DP 相比一维DP,这种类型状态转移与过去每个阶段的状态都有关. Longest Increasing Subsequence : 求最大最小值 Perfect Squares : 求某个规模 ...

  4. Fiddler讲解3

    想要 浏览更多Fiddler内容:请点击进入Fiddler官方文档 阅读目录: 一.Fiddler自定义请求: 二.Fiddler修改请求: 三.减少期望的延迟:100个继续标题: 四.重命名无效的P ...

  5. typescript 入门教程四

    ts中的function和接口 interface PrintCallback{ // 匿名函數,返回类型为空 (success:boolean):void } interface Person{ / ...

  6. 关于Vue中,父组件获取子组件的数据(子组件调用父组件函数)的方法

    1. 父组件调用子组件时,在调用处传给子组件一个方法 :on-update="updateData"   2. 子组件在props中,接收这个方法并声明 props: { onUp ...

  7. 【转】HTTP响应状态码参考簿

    HTTP响应状态码参考簿 http状态返回代码 1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码. http状态返回代码 代码   说明100   (继续) 请求者应当继续提出请求. ...

  8. 微信小程序开发demo

    自己写的小程序,欢迎下载 https://gitee.com/lijunchengit/chengZiShengHuoBang

  9. linux驱动开发随手记【1】

    1.一个patch只完成一项任务 2.用vim编辑多个文件,想同时关闭所有文件时候,可以用 :qall 命令 .vim用户手册08 3.mmc dev 0.mmc为U-boot命令,这句话的含义是设置 ...

  10. 关于get 和post 方法的比较

    地址:https://my.oschina.net/leejun2005/blog/136820 点击这里