万能欧几里得算法 笔记

news/2025/11/26 15:55:41/文章来源:https://www.cnblogs.com/Pengzt/p/19273098

\[\newcommand{\floor}[1]{\left\lfloor #1 \right\rfloor} \newcommand{\ceil}[1]{\left\lceil #1 \right\rceil} \renewcommand{\sf}[2]{\begin{bmatrix} #1 \\ #2 \end{bmatrix}} \renewcommand{\ss}[2]{\begin{Bmatrix} #1 \\ #2 \end{Bmatrix}} \renewcommand{\text}[1]{\operatorname{#1}} \newcommand{\lcm}[0]{\mathop{\text{lcm}}} \newcommand{\kmax}[0]{\mathop{\text{kthmax}}} \newcommand{\kmin}[0]{\mathop{\text{kthmin}}} \newcommand{\matrix}[1]{\begin{matrix}#1\end{matrix}} \newcommand{\bmatrix}[1]{\begin{bmatrix}#1\end{bmatrix}} \]

类欧几里得算法

类欧几里得算法常用于解决形如 \(\sum_i \floor{\frac{ai+b}c}\)\(a, c > 0, b \ge 0\))的问题。

代数推导,当 \(i\)\(0\) 求和到 \(n\) 的答案为 \(f(n, a, b, c)\)

  • \(a>c \lor b > c\),变为 \(f(n, a \bmod c, b \bmod c, c)\)

  • 考虑交换求和顺序,令 \(m=\floor{\frac{an+b}c}\)

    \[\sum_{i=0}^n\floor{\frac{ai+b}c} = \sum_{j=0}^{m}\sum_{i=0} [j < \floor{\frac{ai+b}c}] \]

    对于 \(\floor{\frac{ai+b}c}\),它等于 \(\ceil{\frac{ai+b+1}{c}} - 1\)。则有 \(j+1 < \ceil{\frac{ai+b+1}c}\),变为 \(cj+c-b-1 < ai\),可以得到 \(i > \floor{\frac{cj+c-b-1}{a}}\)。因此 \(f(n, a, b, c)\) 可以变为 \(f(m, c, c-b-1, a)\)

\(n\) 这一维是单调减的,\(a\) 这一维每两步至少除以二,因此时间复杂度是 \(O(\log n)\) 的。

它的几何意义:

  • 对第一步是把斜率大于等于 \(1\) 的都减去 \(\floor{k}\)
  • 对第二步则是把横纵坐标反转。

万能欧几里得算法

我们对类欧几里得算法进行了扩展,考虑一下它的几何意义。

考虑用折线来刻画一下这个求值。我们的直线每穿过一条横线的时候记为 \(U\),穿过一条竖线记为 \(R\)。特别地,当它同时穿过横线和竖线的时候先 \(U\)\(R\)。我们要求这个操作序列最后的位置为 \(R\)

图例为 \(y=\frac{12.2x+2}{9}\)

euclidean-graph1.png

此时 \(x\) 轴为 \(i\),我们维护 \(\floor{\frac{ai+b}{c}}\)\(\sum\floor{\frac{ai+b}{c}}\) 的值。当 \(x \to x+1\) 时,\(\floor{\frac{ax+b}c}\) 会加 \(t\) 次(向上走 \(t\) 步),而 \(\sum\floor{\frac{ai+b}{c}}\) 会加上 \(\floor{\frac{ax+b}c}\)。我们使用矩阵维护(\(\bmatrix{\floor{\frac{ai+b}c} \\ \sum\floor{\frac{ai+b}c}}\)),则每次向上的时候让将其乘上 \(U\),向右乘上 \(R\)。令 \(f(n, a, b, c, U, R)\) 为上述问题的答案(即有 \(n\)\(R\),第 \(i\)\(R\) 前有 \(\floor{\frac{ai+b}c}\)\(U\)最后一个是 \(R\) 的答案),则:

  • \(b \ge c\) 的时候,答案为 \(U^{\floor{b/c}}f(n, a, b \bmod c, c, U, R)\)

  • \(a \ge c\) 的时候,答案为 \(f(n, a \bmod c, b, c, U, U^{\floor{a/c}}R)\)

    即我们变为 euclidean-graph2.png

  • 此时 \(a < c \land b < c\),我们关于 \(y=x\) 对称,即我们对每个 \(U\) 统计其之前的 \(R\) 的个数(这样才能变为一个类似于欧几里得算法的形式)。(几何意义:对于整点的特殊情况,我们平移 \(\frac 1c\) 解决)

    euclidean-graph3.png

  • 对于第 \(i\)\(U\),求 \(\sum_{j \ge 1} \left[\floor{\frac{aj+b}{c}} < i\right]\)。对 \(i > \floor{\frac{aj+b}c}\),有之前的类似转化,变为:

    \[i > \frac{aj+b}c \]

    \[j < \frac{ci-b}a \]

    \[j < \ceil{\frac{ci-b}a} \]

    \[j \le \floor{\frac{ci-b-1}a} \]

    因此第 \(i\)\(U\) 前会有 \(\floor{\frac{ci-b-1}a}\)\(R\),令 \(m = \floor{\frac{an+b}c}\)。我们可以把 \((n, a, b, c)\) 变为 \((m, c, -b-1, a)\)。但是 \(-b-1\) 是负数,我们初始要求 \(a, c \ge 0, b > 0\)。这一个可以直接把 \(i=1\) 的单独计算来解决。还有一个问题是我们要求最后一个是 \(R'\)(即 \(U\)),但是最后若干个变为了 \(U'\)\(R\))。因此我们也需要提出最后一个连续段。

    在提出 \(U^{\floor{\frac{c-b-1}{a}}}\) 后,第 \(x\)\(R\) 前应有 \(\floor{\frac{cx+c-b-1}{a}} - \floor{\frac{c-b-1}{a}} = \floor{\frac {cx+(c-b-1)\bmod a}{a}}\)。最后应有 \(n-\floor{\frac{cm - b - 1}{a}}\)\(R\)

    \(f(n, a, b, c, U, R) = R^{\floor{(c-b-1)/a}}U\cdot f(m, c, (c-b-1)\bmod a, a, R, U) \cdot R^{n - \floor{\frac{cm-b-1}{a}}}\)

    特别地,由于我们需要掐首去尾,我们特判 \(m=0\) 的情况,此时答案为 \(R^n\)

练习1:P5170 【模板】类欧几里德算法
Problem

多组询问,每次给定 \(a, b, c, n\)

\(\sum_{i\le n} \floor{\frac{ai+b}c}\)\(\sum_{i\le n} i\floor{\frac{ai+b}c}\)\(\sum_{i\le n} \floor{\frac{ai+b}c}^2\)

Sol

\(y = \floor{\frac{ax+b}c}\)。需要维护 \(x, y, \sum x, \sum y, \sum y^2, \sum xy\) 的值。

遇到 \(U\) 时,\(y \gets y + 1\)

遇到 \(R\) 时,\(x \gets x+1\)\(sx \gets sx + x\)\(sy \gets sy + y\)\(sy2 \gets sy2 + y^2\)\(sxy \gets sxy + xy\)

考虑合并两个区间的信息。则有 \(x = x_l + x_r\)\(y = y_l + y_r\)\(sx = sx_l + sx_r + x_l\cdot x_r\)\(sy = sy_l + sy_r + y_l \cdot x_r\)\(sy2 = sy2_l + sy2_r + x_ry_l^2 + 2y_l\cdot sy_r\)\(sxy = sxy_l + sxy_r + x_rx_ly_l + x_lsy_r + y_lsx_r\)

Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int P = 998244353;
struct Node {ll x, y, sx, sy, sy2, sxy;Node() : x(0), y(0), sx(0), sy(0), sy2(0), sxy(0) {}Node(ll _x, ll _y, ll _sx, ll _sy, ll _sy2, ll _sxy) : x(_x), y(_y), sx(_sx), sy(_sy), sy2(_sy2), sxy(_sxy) {}friend Node operator*(const Node &l, const Node &r) {Node res;res.x = (l.x + r.x) % P;res.y = (l.y + r.y) % P;res.sx = (l.sx + r.sx + l.x * r.x) % P;res.sy = (l.sy + r.sy + l.y * r.x) % P;res.sy2 = (l.sy2 + r.sy2 + r.x * l.y % P * l.y + 2 * l.y * r.sy) % P;res.sxy = (l.sxy + r.sxy + r.x * l.x % P * l.y % P + l.x * r.sy + l.y * r.sx) % P;return res;}
};
Node QPow(Node a, ll b) {Node res;for (; b; b >>= 1, a = a * a)if (b & 1)res = res * a;return res;
}
Node F(ll n, ll a, ll b, ll c, Node U, Node R) {if (!n) return Node();if (b >= c) return QPow(U, b / c) * F(n, a, b % c, c, U, R);if (a >= c) return F(n, a % c, b, c, U, QPow(U, a / c) * R);ll m = (a * n + b) / c;if (!m) return QPow(R, n);return QPow(R, (c - b - 1) / a) * U * F(m - 1, c, (c - b - 1) % a, a, R, U) * QPow(R, n - (c * m - b - 1) / a);
}
int main() {Node U, R;U.y = 1;R.x = 1, R.sx = 1;int T;scanf("%d", &T);while (T--) {ll n, a, b, c;scanf("%lld%lld%lld%lld", &n, &a, &b, &c);Node ret = F(n, a, b, c, U, R);ret.sy += b / c;ret.sy2 += (b / c) * (b / c);printf("%lld %lld %lld\n", ret.sy % P, ret.sy2 % P, ret.sxy);}return 0;
}
练习2:
Problem

求:

\[C=\sum\limits_{x=1}^LA^xB^{\left\lfloor\frac{Px+R}{Q}\right\rfloor} \]

其中 \(A,B\)\(N\)\(N\) 列的矩阵。\(N \le 20, L,\floor{\frac{PL}{Q}} \le 10^{18}\)

我们维护 \(\prod A, \prod B,\sum A^iB^j\)

遇到 \(U\) 时:\(pb \gets pb \cdot B\)

遇到 \(R\) 时:\(pa \gets pa \cdot A\)\(sab \gets sab + pa\cdot pb\)

考虑合并左右区间的信息。有 \(pa = pa_l \cdot pa_r\)\(pb = pb_l\cdot pb_r\)\(sab = sab_l + pa_l\cdot sab_r\cdot b_l\),这个是因为 \(pb_l, B^k\) 都是 \(B\) 的次幂,所以能交换。

Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef __int128_t i128;
const int P = 998244353;
struct Matrix {int n, m;ll a[25][25];Matrix() : n(0), m(0) { memset(a, 0, sizeof (a)); }Matrix(int _n) : n(_n), m(_n) {memset(a, 0, sizeof (a));for (int i = 1; i <= n; i++) a[i][i] = 1;}Matrix(int _n, int _m) : n(_n), m(_m) { memset(a, 0, sizeof (a)); }ll *operator[](int x) { return a[x]; }const ll *operator[](int x) const { return a[x]; }friend Matrix operator+(const Matrix &a, const Matrix &b) {Matrix c(a.n, a.m);for (int i = 1; i <= a.n; i++)for (int j = 1; j <= a.m; j++)c[i][j] = (a[i][j] + b[i][j]) % P;return c;}friend Matrix operator*(const Matrix &a, const Matrix &b) {Matrix c(a.n, b.m);for (int i = 1; i <= a.n; i++)for (int k = 1; k <= a.m; k++)for (int j = 1; j <= b.m; j++)(c[i][j] += a[i][k] * b[k][j]) %= P;return c;}
};
int m;
struct Node {Matrix x, y, s;Node() : x(m), y(m), s(m, m) {}friend Node operator*(const Node &l, const Node &r) {Node res;res.x = l.x * r.x;res.y = l.y * r.y;res.s = l.s + l.x * r.s * l.y;return res;}
};
Node QPow(Node a, ll b) {Node res;for (; b; b >>= 1, a = a * a)if (b & 1)res = res * a;return res;
}
Node F(ll n, ll a, ll b, ll c, Node U, Node R) {if (!n) return Node();if (b >= c) return QPow(U, b / c) * F(n, a, b % c, c, U, R);if (a >= c) return F(n, a % c, b, c, U, QPow(U, a / c) * R);ll m = ((i128) a * n + b) / c;if (!m) return QPow(R, n);return QPow(R, (c - b - 1) / a) * U * F(m - 1, c, (c - b - 1) % a, a, R, U) * QPow(R, n - ((i128) c * m - b - 1) / a);
}
ll a, b, c, n;
int main() {scanf("%lld%lld%lld%lld%d", &a, &c, &b, &n, &m);Node U, R;for (int i = 1; i <= m; i++)for (int j = 1; j <= m; j++)scanf("%lld", &R.x[i][j]), R.s[i][j] = R.x[i][j];for (int i = 1; i <= m; i++)for (int j = 1; j <= m; j++)scanf("%lld", &U.y[i][j]);Node ans = F(n, a, b, c, U, R);for (int i = 1; i <= m; i++)for (int j = 1; j <= m; j++)printf("%lld%c", ans.s[i][j], " \n"[j == m]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/977313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年11月中国十大咨询公司权威推荐榜:战略管理、财务顾问与数字化转型顶尖品牌深度解析

2025年11月中国十大咨询公司权威推荐榜:战略管理、财务顾问与数字化转型顶尖品牌深度解析 在当今复杂多变的商业环境中,专业咨询服务已成为企业提升竞争力的关键要素。随着数字化转型浪潮的深入推进,企业对战略管理…

课程小程序开发公司,3家专业课程小程序开发公司能力拆解:抖音小程序/支付宝小程序/微信小程序全涵盖

随着在线教育场景的深度渗透,课程小程序凭借轻量化、即用即走的特性,逐渐成为教育机构连接用户的核心入口。从知识付费到职业培训,从K12辅导到兴趣课程,不同类型的教学需求对小程序的功能、体验与扩展性提出了差异…

四川如何选到专业的PET塑钢打包带生产厂家?求靠谱推荐

四川如何选到专业的PET塑钢打包带生产厂家?求靠谱推荐一、公司介绍:技术积淀与规模实力并存四川省新展星包装制品有限公司是一家专业从事PET塑钢打包带生产的四川打包带厂家,成立于2023年7月25日,前身为深耕行业多…

2025年冷拔精密管批发厂家权威推荐榜单:精密管/热轧无缝管/精密光亮管源头厂家精选

在机械制造、汽车液压系统与医疗器械领域,冷拔精密管作为关键结构件与流体输送载体,其尺寸精度、力学性能及表面质量直接影响设备可靠性。行业数据显示,高品质冷拔精密管的尺寸公差可控制在0.05mm以内,液压系统用管…

.NET Core嵌入式编程开关量GPIO(控制2个灯泡交替闪烁)

.NET Core嵌入式编程开关量GPIO(控制2个灯泡交替闪烁)一、在树莓派中安装.NET Core运行时 1、到微软的官方站点下载.NET Core运行时 下载地址2、选择Linux 中的ARM32, 如果不需要跑web,可以选择更精简的.NET Co…

切换到root的方式

sudo -s:通过当前用户密码验证,临时切换到root权限(不加载root环境变量,工作目录不变)。su root:需输入root用户密码,切换到root权限(加载root环境变量,工作目录变为root的家目录)。

2025 十大 LED 移动快拼折叠大屏标杆厂家 高效流动场景首选品牌推荐

LED 移动快拼折叠大屏凭借 “快速拼装、灵活移动、省空间” 的核心优势,已成为巡回演出、临时展会、政企会务等流动场景的核心显示设备。2025 年行业技术向 “智能化、高稳定性、全场景适配” 升级,本文结合技术专利…

使用Maven导入Junit5依赖时的注意事项

原先我的Maven中Junit5依赖如下:<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>RELEASE</version><scope>tes…

构造测试用例

1.SOC验证中,测试用例不要写的太复杂,逻辑单一可控性强很重要; 2.灵活使用define和$test$plusargs,隔离不同的验证场景; 3.基于以上两点,纯随机的CASE不如通过 define和$test$plusargs 来约束随机的 CASE ;这样…

WireShark抓包http,解密https - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年耐磨陶瓷衬板订制厂家权威推荐榜单:陶瓷橡胶复合板/二合一陶瓷衬板/氧化铝陶瓷片源头厂家精选

在电力、矿山、水泥、钢铁等重工业领域,耐磨陶瓷衬板作为抵抗物料冲刷、延长设备寿命的关键部件,其硬度、韧性及定制适配性直接影响设备连续运行时间与维护成本。据行业数据统计,高品质耐磨陶瓷衬板可降低设备磨损率…

2025 年 11 月企业转型升级服务机构权威推荐榜:战略咨询、数字化改造与组织优化服务实力品牌深度解析

2025 年 11 月企业转型升级服务机构权威推荐榜:战略咨询、数字化改造与组织优化服务实力品牌深度解析 在全球经济格局深刻变革的背景下,企业转型升级已成为提升核心竞争力的关键路径。根据最新行业数据显示,超过78%…

使用Java多态性进行数据类型转换

在Java中,多态性是面向对象编程的核心概念之一,它允许对象以多种形式表现。Java的多态性主要体现在方法重载和方法重写上。这种特性使得我们可以编写更加通用和可扩展的代码。 数据类型转换是指将变量从一种类型转换…

基于Xilinx FPGA的三目摄像头AR0135的图像采集与LCD/HDMI/USB显示

一、方案介绍目前市场上基于FPGA的摄像头采集方案多为双目采集,鲜有见到三目摄像头的采集与显示/传输方案。而且大部分方案都是各FPGA开发板随板附赠的双目摄像头采集与LCD/HDMI显示的示例代码,摄像头多采用OV7725/O…

2025年11月薪酬体系设计咨询公司权威推荐榜:战略薪酬架构与绩效激励方案专业定制首选

2025年11月薪酬体系设计咨询公司权威推荐榜:战略薪酬架构与绩效激励方案专业定制首选 随着企业竞争日益激烈,科学合理的薪酬体系已成为吸引和保留核心人才的关键因素。根据最新行业调研数据显示,超过78%的企业正在或…

2025年化学品安全柜批发厂家权威推荐榜单:易制毒安全柜‌/危化品安全柜‌/防爆安全柜源头厂家精选

在安全生产法规日益严格与企业安全意识不断提升的背景下,化学品安全柜作为危化品存储的核心装备,其市场需求正以年增长率18%的速度快速增长。 化学品安全柜通过特殊的结构设计和材料工艺,为易燃、易爆、腐蚀性化学品…

2025智能仓储生产企业排名推荐:聚焦行业前沿,青岛茂源引领智造新趋势

一、行业现状与发展趋势分析 随着“中国制造2025”战略的深入推进,智能制造与数字化转型已成为工业发展的核心驱动力。智能仓储作为供应链管理的关键环节,正加速向高密度化、自动化、信息化、绿色化方向演进。在电商…

2025 年 11 月工厂管理咨询公司权威推荐榜:涵盖精益生产、流程优化、成本控制与效率提升的实战型服务品牌深度解析

2025 年 11 月工厂管理咨询公司权威推荐榜:涵盖精益生产、流程优化、成本控制与效率提升的实战型服务品牌深度解析 随着制造业转型升级步伐加快,工厂管理咨询行业正迎来前所未有的发展机遇。在数字化转型与智能化改造…

题解:P8025 [ONTAK2015] Związek Harcerstwa Bajtockiego

听说 NOIP 考前写题解有助于 rp++。(划掉 (/▽\)) 前置知识:树链剖分(重链剖分)、树剖求 LCA、树剖求 \(K\) 级祖先。 不会也没关系哦,可以看看窝的博客啊(无耻地贴上链接):树链剖分以及求 LCA、树上 \(K\) …

习题解析之:摩尔斯电码转换

习题解析之:摩尔斯电码转换【问题描述】 摩尔斯电码(又译为摩斯密码,Morse code)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬…