题意:

定义将一个\(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)\)的覆盖区间长度即为答案。

代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define N 1000010
  5. #define pll pair <ll, ll>
  6. #define fi first
  7. #define se second
  8. int n;
  9. ll l[N], r[N];
  10. ll A, B;
  11. ll gcd(ll a, ll b) {
  12. return b ? gcd(b, a % b) : a;
  13. }
  14. multiset <pll> se;
  15. void add(ll l, ll r) {
  16. se.insert(pll(l, 1));
  17. se.insert(pll(r + 1, -1));
  18. }
  19. int main() {
  20. while (scanf("%d%lld%lld", &n, &A, &B) != EOF) {
  21. se.clear();
  22. ll sum = 0;
  23. for (int i = 1; i <= n; ++i) {
  24. scanf("%lld%lld", l + i, r + i);
  25. sum += r[i] - l[i] + 1;
  26. }
  27. ll g = gcd(A, B + 1);
  28. if (1.0 * A * B / g > 1e18) {
  29. printf("%lld\n", sum);
  30. continue;
  31. }
  32. ll T = A / g * B;
  33. for (int i = 1; i <= n; ++i) {
  34. if (r[i] - l[i] + 1 >= T) {
  35. printf("%lld\n", T);
  36. return 0;
  37. }
  38. l[i] %= T;
  39. r[i] %= T;
  40. if (l[i] > r[i]) {
  41. add(l[i], T - 1);
  42. add(0, r[i]);
  43. } else {
  44. add(l[i], r[i]);
  45. }
  46. }
  47. ll base = 0, lst = -1, res = 0;
  48. for (auto it : se) {
  49. if (base > 0) res += it.fi - lst;
  50. base += it.se;
  51. lst = it.fi;
  52. }
  53. printf("%lld\n", res);
  54. }
  55. return 0;
  56. }

【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. Elastic Search快速上手(2):将数据存入ES

    前言 在上手使用前,需要先了解一些基本的概念. 推荐 可以到 https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.htm ...

  2. #448 div2 a Pizza Separation

    A. Pizza Separation time limit per test1 second memory limit per test256 megabytes inputstandard inp ...

  3. 数据库中间件之mycat读写分离

    mycat核心概念 逻辑库 mycat中定义.管理的数据库 逻辑表 逻辑库中包含的需分库分表存储的表 datanode 数据节点(分片节点),逻辑表分片的存放节点 datahost 数据主机(节点主机 ...

  4. C#压缩和解压文件

    这里用两种方法实现C#压缩和解压文件 1.使用System.IO.Compression名称空间下的相关类(需引用 System.IO.Compression.FileSystem和System.IO ...

  5. MongoDB安装及环境配置

    一.什么是MongoDB MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为WEB应用提供 ...

  6. Eclipse下使用Maven创建项目出现的archetype错误,记,转

    记自:http://blog.csdn.net/ZhuboSun/article/details/50099635 [1]出现的错误提示: Unable to create project from ...

  7. List<T> or IList<T>

      If you are exposing your class through a library that others will use, you generally want to expos ...

  8. SEO基础知识

    SEO: SEO是由英文Search Engine Optimization缩写而来, 中文意译为“搜索引擎优化”!SEO是指通过对网站进行站内优化和修复(网站Web结构调整.网站内容建设.网站代码优 ...

  9. Ext之页面多次请求问题(下拉框发送无关请求)

    extjs 下拉框在拉取本地数据,然后又要展示后台数据时,出现过此问题(加载页面,自动发送无关的请求导致后台出现错误日志) { xtype:'combo', id:'state', width:130 ...

  10. PLSQL 设置 里面timestamp显示的格式

    转自: https://blog.csdn.net/dietime1943/article/details/52672813# PL/SQL下timestamp日期显示格式问题 现象: 日期检索出来显 ...