Solution -「Luogu 5170」类欧几里得算法
推柿子大赛了属于是。
题目要求三个柿子,不妨分别记为:
f (a, b, c, n) &= \sum \limits _{i = 0} ^{n} \lfloor \frac {ai + b} {c} \rfloor
\nonumber \\
g (a, b, c, n) &= \sum \limits _{i = 0} ^{n} \lfloor \frac {ai + b} {c} \rfloor ^2
\nonumber \\
h (a, b, c, n) &= \sum \limits _{i = 0} ^{n} i\lfloor \frac {ai + b} {c} \rfloor
\nonumber \end {align}
\]
分开化简即可。
Case #1 F.
分类讨论:
若 \(a = 0\),则 \(f (a, b, c, n) = (n + 1) \lfloor \frac {b} {c} \rfloor\)
若 \(a \geq c\) 或 \(b \geq c\),则:
\[\begin {align}
f (a, b, c, n) &= \sum \limits _{i = 0} ^{n} (\lfloor \frac {i(a \bmod c) + (b \bmod c)} {c} \rfloor + i \lfloor \frac {a} {c} \rfloor + \lfloor \frac {b} {c} \rfloor)
\nonumber \\
&= f (a \bmod c, b \bmod c, c, n) + \frac {n (n + 1)} {2} \lfloor \frac {a} {c} \rfloor + (n + 1) \lfloor \frac {b} {c} \rfloor
\nonumber \end {align}
\]若 \(a < c\) 且 \(b < c\),记 \(m = \lfloor \frac {an + b} {c} \rfloor\),则有:
\[\begin {align}
f (a, b, c, n) &= \sum \limits _{i = 0} ^{n} \sum \limits _{j = 1} ^{m} [j \leq \lfloor \frac {ai + b} {c} \rfloor]
\nonumber \\
&= \sum \limits _{i = 0} ^{n} \sum \limits _{j = 0} ^{m - 1} [j c + c < ai + b + 1]
\nonumber \\
&= \sum \limits _{j = 0} ^{m - 1} \sum \limits _{i = 0} ^{n} [i > \lfloor \frac {jc + c - b - 1} {a} \rfloor]
\nonumber \\
&= \sum \limits _{j = 0} ^{m - 1} (n - \lfloor \frac {jc + c - b - 1} {a} \rfloor)
\nonumber \\
&= nm - f(c, c - b - 1, a, m - 1)
\nonumber \end {align}
\]
接下来递归求解。不难发现,递归出口为 \(a = 0\)。
在其他递归过程中,若只关注 \(a\),\(c\) 两项,可以发现我们是在交错执行以下两步:交换 $a $ 和 \(c\)、将 \(a\) 对 \(c\) 取模。这与欧几里得算法类似,故具有和欧几里得算法一样的 \(O(\log )\) 时间复杂度。
Case #2 G & H.
把它们放在一起是因为求法互相依赖,巨大多公式警告。
继续分类讨论。
若 \(a = 0\),则:
\[\begin {align}
g (a, b, c, n) &= (n + 1) \lfloor \frac {b} {c} \rfloor ^ 2
\nonumber \\
h(a, b, c, n) &= \frac {n(n + 1)} {2} \lfloor \frac {b} {c} \rfloor
\nonumber \end {align}
\]若 \(a \geq c\) 或 \(b \geq c\),则:
\[\begin {align}
g (a, b, c, n) &= \sum \limits _{i = 0} ^{n} (\lfloor \frac {i (a \bmod c) + (b \bmod c)} {c} \rfloor + i \lfloor \frac {a} {c} \rfloor + \lfloor \frac {b} {c} \rfloor) ^2
\nonumber \\
&= \sum \limits _{i = 0} ^{n} \lfloor \frac {i (a \bmod c) + (b \bmod c)} {c} \rfloor) ^2 + 2 (i\lfloor \frac {a} {c} \rfloor + \lfloor \frac {b} {c} \rfloor)\lfloor \frac {i (a \bmod c) + (b \bmod c)} {c} \rfloor + (i\lfloor \frac {a} {c} \rfloor + \lfloor \frac {b} {c} \rfloor)^2
\nonumber \\
&= g(a \bmod c, b \bmod c, c, n) + 2 \lfloor \frac {a} {c} \rfloor h (a\bmod c, b \bmod c, c, n) + 2 \lfloor \frac {b} {c} \rfloor f (a\bmod c, b \bmod c, c, n)
\nonumber \\
&+ \sum \limits _{i = 0} ^{n} (\lfloor \frac {a} {c} \rfloor ^2 i^2 + 2 \lfloor \frac {a} {c} \rfloor \lfloor \frac {b} {c} \rfloor i + \lfloor \frac {b} {c} \rfloor ^2)
\nonumber \\
&= g(a \bmod c, b \bmod c, c, n) + 2 \lfloor \frac {a} {c} \rfloor h (a\bmod c, b \bmod c, c, n) + 2 \lfloor \frac {b} {c} \rfloor f (a\bmod c, b \bmod c, c, n)
\nonumber \\
&+ \frac {n (n + 1) (2n + 1)} {6} \lfloor \frac {a} {c} \rfloor ^2 + n(n + 1) \lfloor \frac {a} {c} \rfloor \lfloor \frac {b} {c} \rfloor + (n + 1)\lfloor \frac {b} {c} \rfloor ^2
\nonumber \end {align}
\]接下来关注到 \(h (a, b, c, n)\)。
\[\begin {align}
h (a, b, c, n) &= \sum \limits _{i = 0} ^{n} [i \lfloor \frac {i (a \bmod c) + (b \bmod c)} {c} \rfloor + i (i \lfloor \frac {a} {c} \rfloor + \lfloor \frac {b} {c} \rfloor)]
\nonumber \\
&= h (a \bmod c, b \bmod c, c, n) + \sum \limits _{i = 0} ^{n} (i^2 \lfloor \frac {a} {c} \rfloor + i \lfloor {b} {c} \rfloor)
\nonumber \\
&= h (a \bmod c, b \bmod c, c, n) + \frac {n(n + 1)(2n + 1)} {6} \lfloor \frac {a} {c} \rfloor + \frac {n (n + 1)} {2} \lfloor \frac {b} {c} \rfloor
\nonumber \end {align}
\]若 \(a < c\) 且 \(b < c\),仍记 \(m = \lfloor \frac {an + b} {c} \rfloor\),则有:
\[\begin {align}
g (a, b, c, n) &= 2 \sum \limits _{i = 0} ^{n} \frac {\lfloor \frac {ai + b} {c} \rfloor (\lfloor \frac {ai + b} {c} \rfloor + 1)} {2} - \sum \limits _{i = 0} ^{n} \lfloor \frac {ai + b} {c} \rfloor
\nonumber \\
&= -f (a, b, c, n) + 2 \sum \limits _{i = 0} ^{n} \sum \limits _{j = 1} ^{m} j [j \leq \lfloor \frac {ai + b} {c} \rfloor]
\nonumber \\
&= -f(a, b, c, n) + 2 \sum \limits _{i = 0} ^{n} \sum \limits _{j = 0} ^{m - 1} (j + 1) [jc + c \leq ai + b + 1]
\nonumber \\
&= -f(a, b, c, n) + 2\sum \limits _{j = 0} ^{m - 1} (j + 1) \sum \limits _{i = 0} ^{n} [i > \lfloor \frac {jc + c - b - 1} {a} \rfloor]
\nonumber \\
&= -f(a, b, c, n) + 2\sum \limits _{j = 0} ^{m - 1} (j + 1) (n - \lfloor \frac {jc + c - b - 1} {a} \rfloor)
\nonumber \\
&= nm(m + 1) - f(a, b, c, n) - 2 (\sum \limits _{j = 0} ^{m - 1} j \lfloor \frac {jc + c - b - 1} {a} \rfloor + \sum \limits _{j = 0} ^{m - 1} \lfloor \frac {jc + c - b - 1} {a} \rfloor)
\nonumber \\
&= nm^2 + nm - f (a, b, c, n) - 2h(c, c - b - 1, a, m - 1) - 2f(c, c - b - 1, a, m - 1)
\nonumber \end {align}
\]不要慌还有 \(h(a, b, c, n)\)。
\[\begin {align}
h (a, b, c, n) &= \sum \limits _{i = 0} ^{n} i \sum \limits _{j = 1} ^{m} [j \leq \lfloor \frac {ai + b} {c} \rfloor]
\nonumber \\
&= \sum \limits _{i = 0} ^{n} i \sum \limits _{j = 0} ^{m - 1} [jc + c < ai + b + 1]
\nonumber \\
&= \sum \limits _{j = 0} ^{m - 1} \sum \limits _{i = 0} ^{n} i [i > \lfloor \frac {jc + c - b - 1} {a} \rfloor]
\nonumber \\
&= \frac {mn(n + 1)} {2} - \sum \limits _{j = 0} ^{m - 1} \sum \limits _{i = 0} ^{n} i[i \leq \lfloor \frac {jc + c - b - 1} {a} \rfloor]
\nonumber \\
&= \frac {mn(n + 1)} {2} - \sum \limits _{j = 0} ^{m - 1} \sum \limits _{i = 0} ^{\lfloor \frac {jc + c - b - 1} {a} \rfloor} i
\nonumber \\
&= \frac {mn(n + 1)} {2} - \sum \limits _{j = 0} ^{m - 1} \frac {\lfloor \frac {jc + c - b - 1} {a} \rfloor (\lfloor \frac {jc + c - b - 1} {a} \rfloor + 1)} {2}
\nonumber \\
&= \frac {1} {2} [mn(n + 1) - \sum \limits _{j = 0} ^{m - 1} \lfloor \frac {jc + c - b - 1} {a} \rfloor^2 - \sum \limits _{j = 0} ^{m - 1} \lfloor \frac {jc + c - b - 1} {a} \rfloor]
\nonumber \\
&= \frac {1} {2} [mn(n + 1) - g(c, c - b - 1, a, m - 1) - f (c, c - b - 1, a, m - 1)]
\nonumber \end {align}
\]
Case #3 All.
呜呜呜到这里柿子终于推完了。
显然这三个函数的柿子结构是类似的,我们考虑递归同时求解三个函数即可。
#include <cstdio>
typedef long long LL;
int Abs (int x) { return x < 0 ? -x : x; }
int Max (int x, int y) { return x > y ? x : y; }
int Min (int x, int y) { return x < y ? x : y; }
int Read () {
int x = 0, k = 1;
char s = getchar ();
while (s < '0' || s > '9') {
if (s == '-')
k = -1;
s = getchar ();
}
while ('0' <= s && s <= '9')
x = (x << 3) + (x << 1) + (s ^ 48), s = getchar ();
return x * k;
}
void Write (LL x) {
if (x < 0)
putchar ('-'), x = -x;
if (x > 9)
Write (x / 10);
putchar (x % 10 + '0');
}
void Print (LL x, char s) { Write (x), putchar (s); }
const int Mod = 998244353;
const LL Inv6 = 166374059;
const LL Inv2 = 499122177;
struct Node {
LL f, g, h;
Node () {}
Node (LL F, LL G, LL H) { f = F, g = G, h = H; }
};
LL Sum (LL n) { return n * (n + 1) % Mod * Inv2 % Mod; }
LL Squa (LL n) { return n * (n + 1) % Mod * (2 * n % Mod + 1) % Mod * Inv6 % Mod; }
Node Calc (LL a, LL b, LL c, LL n) {
Node Res;
if (!a) {
Res.f = (n + 1) * (b / c) % Mod;
Res.g = (b / c) * (b / c) % Mod * (n + 1) % Mod;
Res.h = Sum (n) * (b / c) % Mod;
}
else if (a >= c || b >= c) {
Node Tmp = Calc (a % c, b % c, c, n);
Res.f = (Tmp.f + Sum (n) * (a / c) % Mod + (n + 1) * (b / c) % Mod) % Mod;
Res.g = (Tmp.g + 2 * (a / c) % Mod * Tmp.h % Mod + 2 * (b / c) % Mod * Tmp.f) % Mod;
Res.g = (Res.g + Squa (n) * (a / c) % Mod * (a / c) % Mod) % Mod;
Res.g = (Res.g + n * (n + 1) % Mod * (a / c) % Mod * (b / c) % Mod) % Mod;
Res.g = (Res.g + (n + 1) * (b / c) % Mod * (b / c) % Mod) % Mod;
Res.h = (Tmp.h + Squa (n) * (a / c) % Mod + Sum (n) * (b / c) % Mod) % Mod;
}
else {
LL m = (a * n + b) / c;
Node Tmp = Calc (c, c - b - 1, a, m - 1);
Res.f = (n * m % Mod - Tmp.f) % Mod;
Res.f = (Res.f + Mod) % Mod;
Res.g = (n * m % Mod * m % Mod + n * m % Mod - Res.f - 2 * Tmp.h % Mod - 2 * Tmp.f % Mod) % Mod;
Res.g = (Res.g + Mod) % Mod;
Res.h = (m * n % Mod * (n + 1) % Mod - Tmp.g - Tmp.f) % Mod;
Res.h = (Res.h + Mod) % Mod * Inv2 % Mod;
}
return Res;
}
int main () {
int t = Read ();
while (t--) {
LL n = Read (), a = Read (), b = Read (), c = Read ();
Node Res = Calc (a, b, c, n);
Print (Res.f, ' '), Print (Res.g, ' '), Print (Res.h, '\n');
}
return 0;
}
Solution -「Luogu 5170」类欧几里得算法的更多相关文章
- Solution -「LOJ #138」「模板」类欧几里得算法
\(\mathcal{Description}\) Link. \(T\) 组询问,每次给出 \(n,a,b,c,k_1,k_2\),求 \[\sum_{x=0}^nx^{k_1}\left\ ...
- Solution -「Luogu 4135」作诗
写在前面 & 前置芝士 好像是好久没有打理 blog 了.感觉上学期是有点颓.嘶,初三了好好冲一次吧. 那么回到这道题目.你会分块就能看懂. 题目大意 先挂个来自洛谷的 link. ...
- Solution -「Luogu 3959」 宝藏
果真是宝藏题目. 0x01 前置芝士 这道题我是真没往状压dp上去想.题目来源. 大概看了一下结构.盲猜直接模拟退火!\xyx 所需知识点:模拟退火,贪心. 0x02 分析 题目大意:给你一个图,可能 ...
- [P5170] 类欧几里得算法
"类欧几里得算法"第二题 P5170 [题意]已知\(n,a,b,c\),求 \[ \begin{aligned} f_{1}(a,b,c,n)&=\sum_{i=0}^n ...
- LOJ138 类欧几里得算法
类欧几里得算法 给出 \(T\) 组询问,每组用 \(n, a, b, c, k_1, k_2\) 来描述.对于每组询问,请你求出 \[ \sum_{x = 0} ^ {n} x ^ {k_1} {\ ...
- Luogu 5170 【模板】类欧几里得算法
原理不难但是写起来非常复杂的东西. 我觉得讲得非常好懂的博客. 传送门 我们设 $$f(a, b, c, n) = \sum_{i = 0}^{n}\left \lfloor \frac{ai + ...
- Solution -「ARC 104E」Random LIS
\(\mathcal{Description}\) Link. 给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...
- BZOJ3817 Sum(类欧几里得算法)
设$t=\sqrt r$,原题转化为$\sum_{x=1}^n(4*\lfloor\frac{tx}2\rfloor-2*\lfloor tx\rfloor+1)$考虑如何求$\sum_{x=1}^n ...
- 「Luogu 1525」关押罪犯
更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description \(S\)城现有两座监狱,一共关押着\(N\)名罪犯,编号分别为\(1 - N\) ...
随机推荐
- tuandui last
组长博客链接### 组长博客 参考邹欣老师的问题模板进行总结思考### 设想和目标(2分)#### 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 解决的问题 ...
- InnoDB数据存储结构
MySQL服务器上 存储引擎 负责对表中数据的读取和写入工作,不同存储引擎中 存放的格式 一般是不同的,甚至有的存储引擎(Memory)不用磁盘来存储数据. 页 (Page) 是磁盘和内存之间交互的基 ...
- ABP框架之——数据访问基础架构
大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享阅读心得,希望我的文章能成为你成长路上的一块垫脚石,我们一起精进. 几乎所有的业务应用程序都要适用一种数据库基础架构,用来实现数据访问逻辑,以便从数 ...
- 差分隐私(Differential Privacy)定义及其理解
1 前置知识 本部分只对相关概念做服务于差分隐私介绍的简单介绍,并非细致全面的介绍. 1.1 随机化算法 随机化算法指,对于特定输入,该算法的输出不是固定值,而是服从某一分布. 单纯形(simplex ...
- 【原创】史上最简单易懂的kali修改主机名方法
前言 主机名:在一个局域网中,每台机器都有IP地址,但是IP地址不便于人们记忆.于是采用主机名,即利于主机之间的区分,又方便人们的记忆主机.--和域名差不多. 一,查看当前的主机名 ┌──(root㉿ ...
- vue组件data函数
vue组件data通常定义为一个函数并return一个对象,对象中定义的就是组件数据,当然定义数据还有props.computed等方式. data如果直接定义为对象data: {message: ' ...
- 2020.10.17【普及组】模拟赛C组 总结
总结 这次比赛 120 分,老师说上 200 是不容易的,但我觉得这不是我真的水平 改题情况 T1 题目大意:有 N 个小朋友,每个小朋友有 \(B_i\) 个朋友,问从中随机选 3 人使得 3 人关 ...
- Docker容器编译安装Nginx
Docker容器编译安装Nginx,最简单的Nginx配置. 创建容器&进入容器 宿主机2080映射容器的80端口 [root@localhost ~]# docker run -i -d - ...
- .NET中按预定顺序执行任务
更新记录 本文迁移自Panda666原博客,原发布时间:2021年7月1日. 一.说明 在.NET中线程可以定义按先后顺序进行执行,适合部分有先后次序的业务逻辑.Task也可以按照预定义的先后顺序执行 ...
- dubbo容错机制
dubbo的容错机制 Failover Cluster(默认) 失败自动切换,当出现失败,重试其它服务器.通常用于读操作,但重试会带来更长延迟. Failfast Cluster 快速失败,只发起一次 ...