类欧几里得算法学习笔记
类欧几里得算法
类欧几里得算法可以在
基础款
令
-
case 1:
-
case 2:
-
case 3:
先考虑一个问题:已知 ,求 的范围,以上均为正整数。我们变换求和的方法,枚举
我们发现上面的计算过程与欧几里得算法类似,复杂度是
进阶款
等会我们会看到这两个式子具有关联性。
-
case 1:
-
case 2:
-
case 3:
综上,
code:P5170 【模板】类欧几里得算法
#include <cstdio>
#include <iostream>
using namespace std;
const int mo = 998244353;
struct Mint {
int a;
Mint() {}
Mint(int o) { a = o; }
Mint operator+(const Mint& o) const { return (a + o.a) % mo; }
Mint operator+(const int& o) const { return (o + a) % mo; }
Mint operator-(const Mint& o) const {
return Mint(((a - o.a) % mo) + mo) % mo;
}
Mint operator*(const Mint& o) const { return Mint(1ll * a * o.a % mo); }
Mint operator/(const Mint& o) const { return Mint(a / o.a); }
operator int() { return a; }
};
struct func {
Mint f, g, h;
func() {}
func(Mint o, Mint p, Mint q) {
f = o;
g = p;
h = q;
}
};
const Mint inv2 = Mint((mo + 1) >> 1);
const Mint inv3 = Mint((mo + 1) / 3);
const Mint inv6 = Mint(inv2 * inv3);
func calc(int A, int B, int C, int N) {
Mint a = A;
Mint b = B;
Mint c = C;
Mint n = N;
if (!A) {
return func((b / c) * (n + 1), (b / c) * (b / c) * (n + 1),
(b / c) * n * (n + 1) * inv2);
}
func ans;
if (A >= C || B >= C) {
ans = calc(A % C, B % C, C, N);
return func((a / c) * n * (n + 1) * inv2 + (b / c) * (n + 1) + ans.f,
n * (n + 1) * (n + n + 1) * inv6 * (a / c) * (a / c) +
(a / c) * (b / c) * n * (n + 1) +
(b / c) * (b / c) * (n + 1) + ans.g +
(a / c) * ans.h * Mint(2) + (b / c) * ans.f * Mint(2),
(a / c) * n * (n + 1) * (n + n + 1) * inv6 +
(b / c) * n * (n + 1) * inv2 + ans.h);
}
int m = (1ll * A * N + B) / C;
Mint M = Mint(m);
ans = calc(C, C - B - 1, A, m - 1);
return func(M * n - ans.f, n * M * M - ans.h * Mint(2) - ans.f,
M * n * n * inv2 + M * n * inv2 - ans.g * inv2 - ans.f * inv2);
}
int main() {
int T;
cin >> T;
while (T--) {
int a, b, c, n;
scanf("%d%d%d%d", &n, &a, &b, &c);
func ans = calc(a, b, c, n);
printf("%d %d %d\n", ans.f, ans.g, ans.h);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】