传送门

考虑求出最小的循环节 $G$ 使得 $t,t+G$ 得到的数对是一样的

由 $y \equiv t \mod B$ ,得到 $G$ 一定是 $B$ 的倍数,设 $zB=G$,则 $t,t+zB$ 结果相同

代入 $x \equiv (t+\left \lfloor \frac{t}{B} \right \rfloor) \mod A$

得到

$(t+zB+\left \lfloor \frac{t+zB}{B} \right \rfloor) \equiv (t+\left \lfloor \frac{t}{B} \right \rfloor) \mod A$

$(t+zB+z+\left \lfloor \frac{t}{B} \right \rfloor) \equiv (t+\left \lfloor \frac{t}{B} \right \rfloor) \mod A$

$(zB+z) \equiv 0 \mod A$

$z(B+1) \equiv 0 \mod A$

即 $z(B+1)$ 是 $A$ 的倍数

想得到最小的 $G$ 就要先求出最小的 $z$,考虑两边提出公因数 $\gcd(A,B+1)$

那么 $z(B+1)/\gcd(A,B+1) = kA/\gcd(A,B+1) $

此时因为 $(B+1)/\gcd(A,B+1)$ 已经和 $A/\gcd(A,B+1)$ 没有公因数了

那么 $z$ 一定得是 $A/\gcd(A,B+1)$ 的倍数,那么最小的 $z$ 就是当 $k=1$ 时, $z=A/\gcd(A,B+1)$

所以 $G=zB=AB/gcd(A,B+1)$

那么对于一个时间段 $l,r$ ,如果 $r-l+1>=G$ 则所有数都会被覆盖到,答案就是 $G$

否则把 $l,r$ 对 $G$ 取模,因为此时 $r-l+1<G$,所以取模后如果 $l<=r$ 则 $l,r$ 区间的数会被考虑到

如果 $l>r$ 则 $[0,r]$ 和 $[l,G-1]$ 的数会被覆盖到,直接离散化看看哪些区间被覆盖到就好了

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<cmath>
  6. using namespace std;
  7. typedef long long ll;
  8. inline ll read()
  9. {
  10. ll x=,f=; char ch=getchar();
  11. while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
  12. while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
  13. return x*f;
  14. }
  15. const int N=4e6+;
  16. ll n,A,B,ans;
  17. ll gcd(ll a,ll b) { return b ? gcd(b,a%b) : a; }
  18. struct dat{
  19. ll pos,v;
  20. inline bool operator < (const dat &tmp) const {
  21. return pos!=tmp.pos ? pos<tmp.pos : v>tmp.v;
  22. }
  23. }d[N];
  24. ll tot;
  25. int main()
  26. {
  27. n=read(),A=read(),B=read();
  28. ll G=A/gcd(A,B+)*B,l,r;//注意先除后乘
  29. while(n--)
  30. {
  31. l=read(),r=read();
  32. if(r-l+>=G) { printf("%lld\n",G); return ; }
  33. l=l%G,r=r%G;
  34. if(l<=r) d[++tot]=(dat){l,},d[++tot]=(dat){r,-};
  35. else d[++tot]=(dat){,},d[++tot]=(dat){r,-},d[++tot]=(dat){l,},d[++tot]=(dat){G-,-};
  36. }
  37. sort(d+,d+tot+); int now=; ll pre;
  38. for(int i=;i<=tot;i++)
  39. {
  40. if(d[i].v&&!now) pre=d[i].pos;//如果覆盖开始则记录左端点
  41. now+=d[i].v;
  42. if(!now) ans+=d[i].pos-pre+;//覆盖结束统计答案
  43. }
  44. printf("%lld\n",ans);
  45. return ;
  46. }

P5444 [APIO2019]奇怪装置的更多相关文章

  1. Luogu P5444 [APIO2019]奇怪装置

    题目 这种题目看上去就是有循环节的对吧. 在考场上,一个可行的方式是打表. 现在我们手推一下这个循环节. 记函数\(f(t)=(((t+\lfloor\frac tB\rfloor)\%A),(t\% ...

  2. 洛谷$P5444\ [APIO2019]$奇怪装置 数论

    正解:数论 解题报告: 传送门$QwQ$ 我好像当初考的时候这题爆零了,,,部分分都没想到,,,我真的好菜$kk$ 考虑如果在$t_1,t_2$两个时刻有$x_1=x_2,y_1=y_2$是什么情况$ ...

  3. 【LOJ#3144】[APIO2019]奇怪装置(数论)

    [LOJ#3144][APIO2019]奇怪装置(数论) 题面 LOJ 题解 突然发现\(LOJ\)上有\(APIO\)的题啦,赶快来做一做. 这题是窝考场上切了的题嗷.写完暴力之后再推了推就推出正解 ...

  4. 【LG5444】[APIO2019]奇怪装置

    [LG5444][APIO2019]奇怪装置 题面 洛谷 题目大意: 给定\(A,B\),对于\(\forall t\in \mathbb N\),有二元组\((x,y)=((t+\lfloor\fr ...

  5. 题解-APIO2019奇怪装置

    problem loj-3144 题意概要:设函数 \(f(t)\) 的返回值为一个二元组,即 \(f(t)=((t+\lfloor \frac tB\rfloor)\bmod A, t\bmod B ...

  6. [APIO2019] 奇怪装置

    $solution:$ 问题其实就是求两个式子的循环节. 钦定 $t\mod B=0$且 $(t\neq 0)$,其 $t$ 为循环节. 则将 $1$ 式拆开得 $\frac{t\times (B+1 ...

  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-unittest生成报告的几种方式

    import unittest suite = unittest.TestSuite() #构造套件 #按测试方法添加 suite.addTest(测试类名('方法名')) suite.addTest ...

  2. CSS3文本阴影、边框阴影

    CSS3添加阴影 一.使用text-shadow属性为文本添加阴影 二.使用box-shadow属性为边框添加阴影 一.为文本添加阴影 text-shadow     使用text-shadow,可以 ...

  3. 代理修饰词weak/assign/strong的区别

    基于项目报错: WebViewJavascriptBridgeBase 中定义:@property (assign) id <WebViewJavascriptBridgeBaseDelegat ...

  4. 拓展KMP以及模板

    废话不多说,上模板 #include<bits/stdc++.h> ; int Next[maxn], extend[maxn], moL, strL;///Next数组.extend数组 ...

  5. Swift权限控制

    最后更新:2017-03-20 private: 只能在当前类里面访问 fileprivate: 只能在当前文件内访问 internal:internal访问级别所修饰的属性或方法在源代码所在的整个模 ...

  6. idea中svn代码冲突

    1.鼠标右键点击项目根目录 --> 2.选择 subversion --> 3.resolve Text Confict --> 4.merge 手动编辑冲突部分,解决后就能正常提交 ...

  7. fedora18 You might need to install dependency packages for libxcb.

    22 down vote The page Qt for X11 Requirements lists some packages required to build Qt on Debian. Th ...

  8. 字符串处理工具Guava使用总结

    字符串处理工具Guava使用总结 在java开发过程中对字符串的处理是非常频繁的,google的guava工具对字符串的一些处理进行优化,使我们开发过程中让自己的代码看去更加美观,清爽. 1:mave ...

  9. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_16_常用的函数式接口_Function接口中练习-自定义函数模型拼接

  10. 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第6节 static静态_12_静态static关键字修饰成员变量

    创建一个学生类 定义成员变量,无参构造,全参构造.成员变量的getter和setter 所在教室必须是一样的,定义所在教室 下面来创建两个学生 只给one的room赋值了.two的教室并没有赋值.都输 ...