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\) ...
随机推荐
- 【代理是什么?】nginx快速入门+反向代理hexo个人博客
@ 目录 前言 本文说明 请大家务必查看 工作原理 正向代理 反向代理 环境准备 详细版 入门:搭建步骤 配置阿里云epel源: yum安装nginx: 启动nginx: 配置default.conf ...
- 团队Arpha3
队名:观光队 组长博客 作业博客 组员实践情况 王耀鑫 **过去两天完成了哪些任务 ** 文字/口头描述 完成服务器连接数据库部分代码 展示GitHub当日代码/文档签入记录 接下来的计划 服务器网络 ...
- drools的简单入门案例
一.背景 最近在学习规则引擎drools,此处简单记录一下drools的入门案例. 二.为什么要学习drools 假设我们存在如下场景: 在我们到商店购买衣服的时候,经常会发生这样的事情,购买1件不打 ...
- nginx反向代理获取用户真实ip
nginx做反向代理时,默认的配置后端获取到的ip都是来自于nginx,如何转发用户的真实ip到后端程序呢?如是是java后端,用request.getRemoteAddr();获取到的是nginx的 ...
- Vagrant之CentOS
Vagrant之CentOS Vagrant官网 https://www.vagrantup.com https://app.vagrantup.com/boxes/search https://ap ...
- Angular核心概念
一.集成开发环境@angular/cli IE8之后才有debugger工具 2009,nodejs发布,前端Big Bang 1.1 基于NodeJS的工具链 打包工具 grunt 对js代码做合并 ...
- 148_赠送300家门店260亿销售额的零售企业Power BI实战示例数据
焦棚子的文章目录 一背景 2022年即将到来之际,笔者准备在Power BI中做一个实战专题,作为实战专题最基础的就是demo数据,于是我们赠送大家一个300家门店,260亿+销售额,360万行+的零 ...
- PKUSC2022 游记
PKUSC2022 游记 Day1 上午随便看了点题,感觉没看什么题就开考了. 开考之后先看 T1,发现 T1 好像不是那么简单. T1 : 九条可怜有两个账号,她每次都会打 \(\rm rating ...
- MongoDB 常用启动参数
每日一句 Once you choose your way of life, be brave to stick it out and never return. 生活的道路一旦选定,就要勇敢地走到底 ...
- Typora详细教程以及下载
发现一篇非常不错的 Typora 教程,分享给大家. 原文链接:https://www.cnblogs.com/hyacinthLJP/p/16123932.html 作者:MElephant T ...