Luogu4433:[COCI2009-2010#1] ALADIN(类欧几里德算法)
先套用一个线段树维护离散化之后的区间的每一段的答案
那么只要考虑怎么下面的东西即可
\]
拆开就是
\]
只要考虑计算 \(\sum_{i=1}^{n}\lfloor\frac{A\times i}{B}\rfloor\) 即可
类欧几里德算法
若 \(A>B\),那么就是
\]
变成 \(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]\) 与坐标轴围成的三角形中的整点的个数
即
\]
递归处理即可,复杂度和 \(gcd\) 一样
可以先把 \(A,B\) 同时除去 \(gcd\) 后再做
这个题注意一个细节
\]
直接求的可能会爆 \(long \ long\)
可以对 \(B\) 分段,算出长度为 \(B\) 的乘上 \(\lfloor\frac{n}{B}\rfloor\),再加上长度为 \(n \ mod \ B\) 的,可以接受
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
namespace IO {
const int maxn(1 << 21 | 1);
char ibuf[maxn], *iS, *iT, c;
int f;
inline char Getc() {
return iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, maxn, stdin), (iS == iT ? EOF : *iS++)) : *iS++;
}
template <class Int> inline void In(Int &x) {
for (f = 1, c = Getc(); c < '0' || c > '9'; c = Getc()) f = c == '-' ? -1 : 1;
for (x = 0; c >= '0' && c <= '9'; c = Getc()) x = (x << 1) + (x << 3) + (c ^ 48);
x *= f;
}
}
using IO :: In;
const int maxn(1e5 + 5);
int n, m, o[maxn], cnt;
struct Segment {
ll sum;
int a, b, l;
} tr[maxn << 2];
inline void Update(int x) {
tr[x].sum = tr[x << 1].sum + tr[x << 1 | 1].sum;
}
inline int Gcd(int a, int b) {
return !b ? a : Gcd(b, a % b);
}
inline ll Mul(int a, int b, int len) {
register int k = a / b;
register ll sum = 1LL * k * (len + 1) * len / 2;
if (!(a %= b) || !b) return sum;
register int m = 1LL * len * a / b;
assert(m >= 0);
return 1LL * len * m + len / b - Mul(b, a, m) + sum;
}
inline ll Calc(int a, int b, int len) {
if (len < 1 || a == b || b == 1) return 0;
register int g = Gcd(a, b);
return 1LL * a * len * (len + 1) / 2 - 1LL * b * Mul(a / g, b / g, len);
}
inline ll Solve(int a, int b, int len) {
register ll ret = Calc(a, b, len % b);
if (len >= b) ret += 1LL * len / b * Calc(a, b, b);
return ret;
}
inline void Add(int x, int a, int b, int l, int len) {
tr[x].a = a, tr[x].b = b, tr[x].l = l;
tr[x].sum = Solve(a, b, l + len - 1) - Solve(a, b, l - 1);
}
inline void Pushdown(int x, int l, int r) {
if (!tr[x].a) return;
register int mid = (l + r) >> 1;
Add(x << 1, tr[x].a, tr[x].b, tr[x].l, o[mid] - o[l]);
Add(x << 1 | 1, tr[x].a, tr[x].b, tr[x].l + o[mid] - o[l], o[r] - o[mid]);
tr[x].a = tr[x].b = tr[x].l = 0;
}
ll Query(int x, int l, int r, int ql, int qr) {
if (l >= qr || r <= ql) return 0;
if (ql <= l && qr >= r) return tr[x].sum;
Pushdown(x, l, r);
register int mid = (l + r) >> 1;
register ll ret = 0;
if (ql <= mid) ret = Query(x << 1, l, mid, ql, qr);
if (qr >= mid) ret += Query(x << 1 | 1, mid, r, ql, qr);
return ret;
}
void Modify(int x, int l, int r, int ql, int qr, int a, int b) {
if (l >= qr || r <= ql) return;
if (ql <= l && qr >= r) {
Add(x, a, b, o[l] - o[ql] + 1, o[r] - o[l]);
return;
}
Pushdown(x, l, r);
register int mid = (l + r) >> 1;
if (ql <= mid) Modify(x << 1, l, mid, ql, qr, a, b);
if (qr >= mid) Modify(x << 1 | 1, mid, r, ql, qr, a, b);
Update(x);
}
int op[maxn], ql[maxn], qr[maxn], a[maxn], b[maxn];
int main () {
In(n), In(m);
register int i, l, r;
for (i = 1; i <= m; ++i) {
In(op[i]), In(ql[i]), In(qr[i]), --ql[i];
o[++cnt] = ql[i], o[++cnt] = qr[i];
if (op[i] == 1) In(a[i]), In(b[i]);
}
sort(o + 1, o + cnt + 1), cnt = unique(o + 1, o + cnt + 1) - o - 1;
for (i = 1; i <= m; ++i) {
l = lower_bound(o + 1, o + cnt + 1, ql[i]) - o;
r = lower_bound(o + 1, o + cnt + 1, qr[i]) - o;
if (op[i] == 1) Modify(1, 1, cnt, l, r, a[i], b[i]);
else printf("%lld\n", Query(1, 1, cnt, l, r));
}
return 0;
}
Luogu4433:[COCI2009-2010#1] ALADIN(类欧几里德算法)的更多相关文章
- UOJ#42. 【清华集训2014】Sum 类欧几里德算法
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ42.html 题解 首先我们把式子改写一下: $$(-1)^{\lfloor a\rfloor} \\=1 ...
- 2018牛客网暑假ACM多校训练赛(第十场)H Rikka with Ants 类欧几里德算法
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-H.html 题目传送门 - https://www.n ...
- BZOJ2987:Earthquake(类欧几里德算法)
Sol 设 \(n=\lfloor\frac{c}{a}\rfloor\) 问题转化为求 \[\sum_{i=0}^{n}\lfloor\frac{c-ax}{b}\rfloor+1=\sum_{i= ...
- 类欧几里德算法(洛谷 P5170
#include <iostream> #include <cstdio> #include <queue> #include <algorithm> ...
- (扩展欧几里德算法)zzuoj 10402: C.机器人
10402: C.机器人 Description Dr. Kong 设计的机器人卡尔非常活泼,既能原地蹦,又能跳远.由于受软硬件设计所限,机器人卡尔只能定点跳远.若机器人站在(X,Y)位置,它可以原地 ...
- 欧几里德与扩展欧几里德算法 Extended Euclidean algorithm
欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd( ...
- POJ 1061青蛙的约会(拓展欧几里德算法)
题目链接: 传送门 青蛙的约会 Time Limit: 1000MS Memory Limit: 65536K Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见 ...
- poj2142-The Balance(扩展欧几里德算法)
一,题意: 有两个类型的砝码,质量分别为a,b;现在要求称出质量为d的物品, 要用多少a砝码(x)和多少b砝码(y),使得(x+y)最小.(注意:砝码位置有左右之分). 二,思路: 1,砝码有左右位置 ...
- poj2115-C Looooops(扩展欧几里德算法)
本题和poj1061青蛙问题同属一类,都运用到扩展欧几里德算法,可以参考poj1061,解题思路步骤基本都一样.一,题意: 对于for(i=A ; i!=B ;i+=C)循环语句,问在k位存储系统中循 ...
随机推荐
- H5入门基础(一)
我们还是围绕这几个问题来学习: 1.什么是H5? 2.为什么要用H5? 3.怎么用H5? 1.什么是H5? ♦HTML是指超文本标记语言(Hyper Text Markup Language). ♦H ...
- 结合业务,精炼SQL
现代网站,性能的瓶颈都围绕着数据库的性能来谈.数据库是存储的核心部件,在日益增长的流量中会凸显数据库的性能瓶颈.从<淘宝技术十年>书中来看,淘宝发展历程中从MYSQL换成了ORACLE又换 ...
- [转]NSProxy实现AOP方便为ios应用实现异常处理策略
[转载自:http://blog.csdn.net/yanghua_kobe/article/details/8395535] 前段时间关注过objc实现的AOP,在GitHub找到了其中的两个库:A ...
- docker微服务部署之:二、搭建文章微服务项目
docker微服务部署之:一,搭建Eureka微服务项目 一.新增demo_article模块,并编写代码 右键demo_parent->new->Module->Maven,选择M ...
- leetcode-39-组合总和(有趣的递归)
题目描述: 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无 ...
- Python基础部分的疑惑解析(2)
变量: 变量名由 字母.数字.下划线构成,数字不能做为开头 不能用关键字:另外一些内置的方法也别用 推荐使用下划线命名间两个单词user_id 变量在最后底层处理的时候没什么意义,但是在命名的时候有利 ...
- win10 安装 mysql 5.7
win10 安装 mysql 5.7 1.在mysql 官网下载mysql 5.7 的手动安装包 mysql--winx64.zip 2. 解压到mysql 目录的文件夹下面 D:\moudle\my ...
- (转)多种方法实现Loading(加载)动画效果
当我们ajax提交一个按钮的时候,给那个按钮来个Loading效果会高端很多,体验也会上升个层次. 既能让用户知道正在提交中,也能防止二次提交,好处多多呢.
- 关于微信企业号操作api的sdk封装 (.net)
做微信的第三方开发业半年多了 现在献上微信企业号的操作sdk(包括源码) 本人水平有限 望大家多提意见 下载地址献上:下载
- 爬虫URL去重
这个要看你想抓取的网页数量是哪种规模的.如果是千万以下用hash表, set, 布隆过滤器基本可以解决,如果是海量的......嗯我也没做过海量的,不过hash表之类的就别想了,内存根本不够,分割线下 ...