先套用一个线段树维护离散化之后的区间的每一段的答案

那么只要考虑怎么下面的东西即可

\[\sum_{i=1}^{n}(A\times i \ mod \ B)
\]

拆开就是

\[\sum_{i=1}^{n}A\times i-B\times \sum_{i=1}^{n}\lfloor\frac{A\times i}{B}\rfloor
\]

只要考虑计算 \(\sum_{i=1}^{n}\lfloor\frac{A\times i}{B}\rfloor\) 即可

类欧几里德算法

若 \(A>B\),那么就是

\[\lfloor\frac{A}{B}\rfloor\sum_{i=1}^{n}i+\sum_{i=1}^{n}\lfloor\frac{(A \ mod \ B)\times i}{B}\rfloor
\]

变成 \(A<B\) 的情况

对于 \(A<B\),那么可以看成是求直线 \(y=\frac{A}{B}\times i,i\in[1,n]\) 与坐标轴围成的三角形中的整点的个数

设 \(m=\lfloor\frac{A\times n}{B}\rfloor\)

把问题为矩形 \((0,0),(n,m)\) 内的减去三角形 \((0,0),(n,m),(0,m)\) 内的再加上对角线的

对角线上的就是 \(\frac{n\times gcd(A,B)}{B}\),矩形内的就是 \(n\times m\)

对于那个三角形的,反转坐标系后相当于是求直线 \(y=\frac{B}{A}\times i,i\in[1,\lfloor\frac{A\times n}{B}\rfloor]\) 与坐标轴围成的三角形中的整点的个数

\[\sum_{i=1}^{\lfloor\frac{A\times n}{B}\rfloor}\lfloor\frac{B\times i}{A}\rfloor
\]

递归处理即可,复杂度和 \(gcd\) 一样

可以先把 \(A,B\) 同时除去 \(gcd\) 后再做

这个题注意一个细节

\[\sum_{i=1}^{n}A\times i-B\times \sum_{i=1}^{n}\lfloor\frac{A\times i}{B}\rfloor
\]

直接求的可能会爆 \(long \ long\)

可以对 \(B\) 分段,算出长度为 \(B\) 的乘上 \(\lfloor\frac{n}{B}\rfloor\),再加上长度为 \(n \ mod \ B\) 的,可以接受

  1. # include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. namespace IO {
  5. const int maxn(1 << 21 | 1);
  6. char ibuf[maxn], *iS, *iT, c;
  7. int f;
  8. inline char Getc() {
  9. return iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, maxn, stdin), (iS == iT ? EOF : *iS++)) : *iS++;
  10. }
  11. template <class Int> inline void In(Int &x) {
  12. for (f = 1, c = Getc(); c < '0' || c > '9'; c = Getc()) f = c == '-' ? -1 : 1;
  13. for (x = 0; c >= '0' && c <= '9'; c = Getc()) x = (x << 1) + (x << 3) + (c ^ 48);
  14. x *= f;
  15. }
  16. }
  17. using IO :: In;
  18. const int maxn(1e5 + 5);
  19. int n, m, o[maxn], cnt;
  20. struct Segment {
  21. ll sum;
  22. int a, b, l;
  23. } tr[maxn << 2];
  24. inline void Update(int x) {
  25. tr[x].sum = tr[x << 1].sum + tr[x << 1 | 1].sum;
  26. }
  27. inline int Gcd(int a, int b) {
  28. return !b ? a : Gcd(b, a % b);
  29. }
  30. inline ll Mul(int a, int b, int len) {
  31. register int k = a / b;
  32. register ll sum = 1LL * k * (len + 1) * len / 2;
  33. if (!(a %= b) || !b) return sum;
  34. register int m = 1LL * len * a / b;
  35. assert(m >= 0);
  36. return 1LL * len * m + len / b - Mul(b, a, m) + sum;
  37. }
  38. inline ll Calc(int a, int b, int len) {
  39. if (len < 1 || a == b || b == 1) return 0;
  40. register int g = Gcd(a, b);
  41. return 1LL * a * len * (len + 1) / 2 - 1LL * b * Mul(a / g, b / g, len);
  42. }
  43. inline ll Solve(int a, int b, int len) {
  44. register ll ret = Calc(a, b, len % b);
  45. if (len >= b) ret += 1LL * len / b * Calc(a, b, b);
  46. return ret;
  47. }
  48. inline void Add(int x, int a, int b, int l, int len) {
  49. tr[x].a = a, tr[x].b = b, tr[x].l = l;
  50. tr[x].sum = Solve(a, b, l + len - 1) - Solve(a, b, l - 1);
  51. }
  52. inline void Pushdown(int x, int l, int r) {
  53. if (!tr[x].a) return;
  54. register int mid = (l + r) >> 1;
  55. Add(x << 1, tr[x].a, tr[x].b, tr[x].l, o[mid] - o[l]);
  56. Add(x << 1 | 1, tr[x].a, tr[x].b, tr[x].l + o[mid] - o[l], o[r] - o[mid]);
  57. tr[x].a = tr[x].b = tr[x].l = 0;
  58. }
  59. ll Query(int x, int l, int r, int ql, int qr) {
  60. if (l >= qr || r <= ql) return 0;
  61. if (ql <= l && qr >= r) return tr[x].sum;
  62. Pushdown(x, l, r);
  63. register int mid = (l + r) >> 1;
  64. register ll ret = 0;
  65. if (ql <= mid) ret = Query(x << 1, l, mid, ql, qr);
  66. if (qr >= mid) ret += Query(x << 1 | 1, mid, r, ql, qr);
  67. return ret;
  68. }
  69. void Modify(int x, int l, int r, int ql, int qr, int a, int b) {
  70. if (l >= qr || r <= ql) return;
  71. if (ql <= l && qr >= r) {
  72. Add(x, a, b, o[l] - o[ql] + 1, o[r] - o[l]);
  73. return;
  74. }
  75. Pushdown(x, l, r);
  76. register int mid = (l + r) >> 1;
  77. if (ql <= mid) Modify(x << 1, l, mid, ql, qr, a, b);
  78. if (qr >= mid) Modify(x << 1 | 1, mid, r, ql, qr, a, b);
  79. Update(x);
  80. }
  81. int op[maxn], ql[maxn], qr[maxn], a[maxn], b[maxn];
  82. int main () {
  83. In(n), In(m);
  84. register int i, l, r;
  85. for (i = 1; i <= m; ++i) {
  86. In(op[i]), In(ql[i]), In(qr[i]), --ql[i];
  87. o[++cnt] = ql[i], o[++cnt] = qr[i];
  88. if (op[i] == 1) In(a[i]), In(b[i]);
  89. }
  90. sort(o + 1, o + cnt + 1), cnt = unique(o + 1, o + cnt + 1) - o - 1;
  91. for (i = 1; i <= m; ++i) {
  92. l = lower_bound(o + 1, o + cnt + 1, ql[i]) - o;
  93. r = lower_bound(o + 1, o + cnt + 1, qr[i]) - o;
  94. if (op[i] == 1) Modify(1, 1, cnt, l, r, a[i], b[i]);
  95. else printf("%lld\n", Query(1, 1, cnt, l, r));
  96. }
  97. return 0;
  98. }

Luogu4433:[COCI2009-2010#1] ALADIN(类欧几里德算法)的更多相关文章

  1. UOJ#42. 【清华集训2014】Sum 类欧几里德算法

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ42.html 题解 首先我们把式子改写一下: $$(-1)^{\lfloor a\rfloor} \\=1 ...

  2. 2018牛客网暑假ACM多校训练赛(第十场)H Rikka with Ants 类欧几里德算法

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-H.html 题目传送门 - https://www.n ...

  3. BZOJ2987:Earthquake(类欧几里德算法)

    Sol 设 \(n=\lfloor\frac{c}{a}\rfloor\) 问题转化为求 \[\sum_{i=0}^{n}\lfloor\frac{c-ax}{b}\rfloor+1=\sum_{i= ...

  4. 类欧几里德算法(洛谷 P5170

    #include <iostream> #include <cstdio> #include <queue> #include <algorithm> ...

  5. (扩展欧几里德算法)zzuoj 10402: C.机器人

    10402: C.机器人 Description Dr. Kong 设计的机器人卡尔非常活泼,既能原地蹦,又能跳远.由于受软硬件设计所限,机器人卡尔只能定点跳远.若机器人站在(X,Y)位置,它可以原地 ...

  6. 欧几里德与扩展欧几里德算法 Extended Euclidean algorithm

    欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd( ...

  7. POJ 1061青蛙的约会(拓展欧几里德算法)

    题目链接: 传送门 青蛙的约会 Time Limit: 1000MS     Memory Limit: 65536K Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见 ...

  8. poj2142-The Balance(扩展欧几里德算法)

    一,题意: 有两个类型的砝码,质量分别为a,b;现在要求称出质量为d的物品, 要用多少a砝码(x)和多少b砝码(y),使得(x+y)最小.(注意:砝码位置有左右之分). 二,思路: 1,砝码有左右位置 ...

  9. poj2115-C Looooops(扩展欧几里德算法)

    本题和poj1061青蛙问题同属一类,都运用到扩展欧几里德算法,可以参考poj1061,解题思路步骤基本都一样.一,题意: 对于for(i=A ; i!=B ;i+=C)循环语句,问在k位存储系统中循 ...

随机推荐

  1. Android屏幕尺寸单位转换

    最近在看Android群英传这本书,书中有一节涉及到了,屏幕尺寸与单位.觉得以后可能会用到,做个笔记. PPI(pixels per inch) ,又称为DPI,它是由对角线的像素点数除以屏幕的大小得 ...

  2. pyserial timeout=1 || timeout=0.01

    昨天在做串口通信时候发现,串口参数(timeout=1 || timeout=0.01)对通信的读数据竟然影响很大,代码如下: self.ser = serial.Serial(port=serial ...

  3. (转)Oracle与DB2在数据库高可用技术上的相同与差异探讨

    原文:http://www.talkwithtrend.com/Article/178339 数据库建设过程中,高可用是每一个企业数据中心数据库建设过程中至关重要的一个关注点,直接关系到业务连续性和稳 ...

  4. rocksDB vs InnoDB vsTokuDB

    原文地址 https://minervadb.com/index.php/2018/08/06/comparing-tokudb-rocksdb-and-innodb-performance-on-i ...

  5. AngularJS 的常用特性(四)

    11.使用 Module(模块) 组织依赖关系 Angular 里面的模板,提供了一种方法,可以用来组织应用中一块功能区域的依赖关系:同时还提供了一种机制,可以自动解析依赖关系(又叫依赖注入),一般来 ...

  6. 我爱Markdown (1)

    作为一个程序员,用Word, Excel等写技术文档实在是不那么方便.而我,作为一个Unix/Linux程序员,写技术文档还是喜欢用Wiki等在线写作工具.虽然Wiki已经很酷了,但跟Markdown ...

  7. 通配符证书导致 Outlook Anywhere 的客户端连接问题

    通配符证书导致 Outlook Anywhere 的客户端连接问题 本主题介绍当您使用 Outlook Anywhere 连接到 Microsoft Exchange 及在组织中跨 Exchange ...

  8. JMM随笔

    What? Java内存模型(Java Memory Model,JMM)主要是为了规定了线程和内存之间的一些关系. 根据JMM的设计: 系统存在一个主内存(Main Memory),Java中所有变 ...

  9. Linux笔记-Linux的命令初解1

    我是一个Linux的初学者,经验肯定没有大牛们那么全面,但是我很想把自己在学习过程中的所有所学和一些自己的感悟写下来. 首先我主要看的书为<鸟哥的私房菜>,这是一本非常棒的书,但是你会发现 ...

  10. MyBatis Generator 详解(转)

    MyBatis Generator中文文档 MyBatis Generator中文文档地址:http://mbg.cndocs.tk/ 该中文文档由于尽可能和原文内容一致,所以有些地方如果不熟悉,看中 ...