#3144. 「APIO 2019」奇怪装置
#3144. 「APIO 2019」奇怪装置
题目描述
考古学家发现古代文明留下了一种奇怪的装置。该装置包含两个屏幕,分别显示两个整数 \(x\) 和 \(y\)。
经过研究,科学家对该装置得出了一个结论:该装置是一个特殊的时钟,它从过去的某个时间点开始测量经过的时刻数 \(t\),但该装置的创造者却将 \(t\) 用奇怪的方式显示出来。若从该装置开始测量到现在所经过的时刻数为 \(t\),装置会显示两个整数:\(x = ((t + \lfloor \frac{t}{B} \rfloor) \bmod A)\),与 \(y = (t \bmod B)\)。这里 \(\lfloor x\rfloor\) 是下取整函数,表示小于或等于 \(x\) 的最大整数。
考古学家通过进一步研究还发现,该装置的屏幕无法一直工作。实际上,该装置的屏幕只在 \(n\) 个连续的时间区间段中能正常工作。第 \(i\) 个时间段从时刻 \(l_i\) 到时刻 \(r_i\)。现在科学家想要知道有多少个不同的数对 \((x, y)\) 能够在该装置工作时被显示出来。
两个数对 \((x_1, y_1)\) 和 \((x_2, y_2)\) 不同当且仅当 \(x_1 \not = x_2\) 或 \(y_1 \not = y_2\)。
输入格式
第一行包含三个整数 \(n, A\) 与 \(B\)。
接下来 \(n\) 行每行两个整数 \(l_i, r_i\),表示装置可以工作的第 \(i\) 个时间区间。
输出格式
输出一行一个整数表示问题的答案。
数据范围与提示
对于全部数据,\(1\le n\le 10^6,1\le A,B\le 10^{18},0\le l_i\le r_i\le 10^{18},r_i<l_{i+1}\)。
首先这玩意肯定是有环的。找到过后将所有线段平移到环内就可以直接做线段覆盖。
对于一个数\(t\),首先跟他同构的数可以表示为\(t+k*B\),因为要保证\(y\)相同。然后\(t\)每增加\(B\),\(x\)就增加\(B+1\),增加了\(\frac{A}{\gcd(A,B+1)}\)后有会同构。所以环大小\(\frac{B*A}{\gcd(A,B+1)}\)。
代码:
#include<bits/stdc++.h>
#define ll long long
#define N 1000005using namespace std;
inline ll Get() {ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}int n;
ll A,B,len;
struct node {ll l,r;bool operator <(const node &a)const {if(l!=a.l) return l<a.l;return r<a.r;}
}s[N<<1];
ll gcd(ll a,ll b) {return !b?a:gcd(b,a%b);}int main() {n=Get(),A=Get(),B=Get();for(int i=1;i<=n;i++) s[i].l=Get(),s[i].r=Get();ll g=gcd(A,B+1);ll ans=0;if((long double)A/g*B>1e18) {for(int i=1;i<=n;i++) ans+=s[i].r-s[i].l+1;} else {ll len=A/g*B;int tot=n;for(int i=1;i<=n;i++) {if(s[i].r-s[i].l+1>=len) {cout<<len;return 0;}s[i].l%=len,s[i].r%=len;if(s[i].l>s[i].r) {s[++tot].l=0,s[tot].r=s[i].r;s[i].r=len-1;}}sort(s+1,s+1+tot);ll last=-1;for(int i=1;i<=tot;i++) {if(s[i].r<last) continue ;ans+=s[i].r-max(s[i].l-1,last);last=s[i].r;}}cout<<ans;return 0;
}
转载于:https://www.cnblogs.com/hchhch233/p/11096863.html
#3144. 「APIO 2019」奇怪装置相关推荐
- 「APIO 2019」奇怪装置
题目描述 考古学家发现古代文明留下了一种奇怪的装置.该装置包含两个屏幕,分别显示两个整数 $x$ 和 $y$. 经过研究,科学家对该装置得出了一个结论:该装置是一个特殊的时钟,它从过去的某个时间点开始 ...
- LOJ#3054. 「HNOI 2019」鱼
LOJ#3054. 「HNOI 2019」鱼 https://loj.ac/problem/3054 题意 平面上有n个点,问能组成几个六个点的鱼.(n<=1000) 分析 鱼题,劲啊. 容易想 ...
- 「BJOI 2019」排兵布阵
传送门 problem 小 C 正在玩一款排兵布阵的游戏.在游戏中有 nnn 座城堡,每局对战由两名玩家来争夺这些城堡.每名玩家有 mmm 名士兵,可以向第 iii 座城堡派遣 aia_iai 名士 ...
- 「BJOI 2019」勘破神机
传送门 problem 经过了一个月的艰苦尝试,你的研究团队破译了 "2""2""2" 型奥术宝石和 "3"" ...
- 「BJOI 2019」奥术神杖
传送门 problem 神杖上从左到右镶嵌了 n n n 颗奥术宝石,奥术宝石一共有 10 10 10 种,用数字 " 0123456789 " "0123456789& ...
- 【LOJ #6617】「THUPC 2019」摆家具 / furniture(DP / BSGS / 矩阵快速幂)
传送门 首先显然k=lognk=lognk=logn 显然对于每个iii我们只用关注有多少位与询问的数字不同 考虑分成两个部分 先对每个数字iii求出与他有jjj位不同的数字价值之和 再求出ttt轮后 ...
- 「CSP-S 2019」 Emiya 家今天的饭 题解
题面 样例 2 3 1 0 1 0 1 1 3 分析 考虑正着限制最大的数不超过一半不好做,那我们可以反着来. 令 dp[i][j][k]dp[i][j][k]dp[i][j][k] 为第 iii 行 ...
- LOJ #6672. 「XXOI 2019」惠和惠惠和惠惠惠(生成函数,整式递推)
题目 没有latex就没有推式子的动力怎么破? 设 f i , j f_{i,j} fi,j表示在前 j j j个回合里,血量为 0 0 0了 i i i个回合且第 j j j个回合血量为 0 0 ...
- 编写脚本、篡改数据,90后百度程序员「挣外快」被判刑!
[导读]百度一名92年的程序员,为了「挣点外快」,通过编写脚本.篡改数据等方式,在半年左右违规通过了735个媒体网站账号加入「百度联盟」的申请,使得公司损失 374 万元广告分成.然而,「破坏计算机信 ...
最新文章
- Character流与Byte流的区别
- MIT有个做披萨的GAN,登上了CVPR:加香肠、去橄榄、再烤熟,分层才是王道
- c++全局类对象_史上最全 Python 面向对象编程
- Jenkins中连接Git仓库时提示:无法连接仓库:Error performing git command: git ls-remote -h
- 数据结构之线性存储结构
- spring aop组件_安全性中的Spring AOP –通过方面控制UI组件的创建
- 【当头棒喝】你是真的了解云计算吗?
- Java中的equals和==的差别 以及Java中等价性和同一性的讨论
- instagram图片大小_一个开源的Instagram桌面照片上传器
- 基础知识—数据类型-数据的输出与输入
- 操作高通QXDM5,点击重置按钮出现报错
- (1.6w字)浏览器灵魂之问,请问你能接得住几个?
- 使用金蝶云星空(以前叫:金蝶K3 CLOUD)后,感觉像踩进了一个坑
- jzoj 3457. 【NOIP2013模拟联考3】沙耶的玩偶(doll) (Standard IO)
- 登出系统gif图标_来了!深度操作系统 20正式版——崭新视界,创无止境
- Python实现聊天机器人
- 软件工程第五章——总体设计
- snprintf()函数探讨
- 如何退出python命令行
- Windows安装TensorFlow教程(国内源安装附上各大镜像网站网址)