题意:

定义将一个\(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. windows 下搭建go开发环境

    下载golang安装包: 步骤一: 先打开环境变量配置的界面 步骤二;配置我们的环境变量 对上图的一个说明: 1).path这个变量不需要再创建,因为系统本就有,在后面添加即可. 2).增加Go的bi ...

  2. 微软商店一直安装不上Intel Media SDK DFP

    具体表现为一直安装失败,但是下载进度条一直在,无法去除. 此方法来自 https://answers.microsoft.com/en-us/windows/forum/all/error-code- ...

  3. 解决windows 激活问题

    解决windows 激活问题 下载 然后 搞定  重启

  4. Qt:用 __thread 关键字让每个线程有自己的全局变量

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/wsj18808050/article/d ...

  5. vmware vSphere Data Protection 6.1--------2-初始化

    一.简介 安装完vdp接下来就是部署初始化了 安装篇请参考:vmware vSphere Data Protection 6.1部署 二.开始初始化 登陆https://192.168.216.200 ...

  6. Spring Cloud Alibaba学习笔记(10) - Spring消息编程模型下,使用RocketMQ收发消息

    编写生产者 集成 添加依赖 <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId&g ...

  7. java模板模式项目中使用--封装一个http请求工具类

    需要调用http接口的代码继承FundHttpTemplate类,重写getParamData方法,在getParamDate里写调用逻辑. 模板: package com.crb.ocms.fund ...

  8. 预编译And作用域链

    首先要理解什么是预编译: 预编译就是在JS执行前的一瞬间创建一个AO对象,这个创建AO的过程叫做预编译. console.log(a) var a = 1; function c(b){ b = 10 ...

  9. Redis其他数据结构

    用户日活月活怎么统计 - Redis HyperLogLog 详解 HyperLogLog 提出问题 我们先思考一个常见的业务问题:如果你负责开发维护一个大型的网站,有一天老板找产品经理要网站每个网页 ...

  10. 【视频】谷歌大佬30分钟让你入门机器学习(2019谷歌I/O资源分享)

    如果你是个谷粉,就一定会知道: 谷歌向来都很大胆.当所有的科技公司都在讲产品.讲利润的时候,2019年的谷歌开发者大会的主题却是:人文关怀.要知道,这是政府操心的事,而不是一家公司的任务. 谷歌敢这样 ...