news 2026/4/16 12:51:28

莫比乌斯反演详细解说来啦!!!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
莫比乌斯反演详细解说来啦!!!

const int MAXN = 1e7; // 根据题目需求调整最大值 int mu[MAXN + 1]; bool is_prime[MAXN + 1]; vector; void init_mobius() { memset(is_prime, true, sizeof(is_prime)); is_prime[0] = is_prime[1] = false; mu[1] = 1; // 初始化n=1的情况 for (int i = 2; i N; ++i) { if (is_prime[i]) { // i是质数 prime.push_back(i); mu[i] = -1; // 单个质数,m=1,mu=-1 } for (int p : prime) { if (i * p > MAXN) break; is_prime[i * p] = false; if (i % p == 0) { // p是i的因子,i*p有平方因子 mu[i * p] = 0; break; } else { // p与i互质,积性函数性质 mu[i * p] = mu[i] * mu[p]; } } } }

int solve(int a, int b, int d) { a /= d; b /= d; if (a > b) swap(a, b); int res = 0; for (int l = 1, r; l l = r + 1) { r = min(a / (a / l), b / (b / l)); // 整除分块 res += (prefix_mu[r] - prefix_mu[l - 1]) * (a / l) * (b / l); } return res; }

#include h> using namespace std; const int MAXN = 5e4; // 题目数据范围通常为1e4~1e5,5e4足够覆盖 int mu[MAXN + 1]; bool is_prime[MAXN + 1]; vector<int> prime; long long prefix_mu[MAXN + 1]; // 前缀和(用long long避免溢出) // 初始化莫比乌斯函数和前缀和 void init_mobius() { memset(is_prime, true, sizeof(is_prime)); is_prime[0] = is_prime[1] = false; mu[1] = 1; for (int i = 2; i N; ++i) { if (is_prime[i]) { prime.push_back(i); mu[i] = -1; } for (int p : prime) { if (i * p > MAXN) break; is_prime[i * p] = false; if (i % p == 0) { mu[i * p] = 0; break; } else { mu[i * p] = mu[i] * mu[p]; } } } // 预处理前缀和 prefix_mu[0] = 0; for (int i = 1; i ) { prefix_mu[i] = prefix_mu[i - 1] + mu[i]; } } // 计算 1<=xX, 1<=Y 且 gcd(x,y)=k 的数对个数 long long calc(int X, int Y, int k) { if (X == 0 || Y == 0) return 0; X /= k; Y /= k; if (X > Y) swap(X, Y); long long res = 0; // 整除分块优化求和 for (int l = 1, r; l + 1) { r = min(X / (X / l), Y / (Y / l)); res += (prefix_mu[r] - prefix_mu[l - 1]) * 1LL * (X / l) * (Y / l); } return res; } int main() { init_mobius(); int T; cin >> T; while (T--) { int a, b, c, d, k; cin >> a >> b >> c >> d >> k; long long ans = calc(b, d, k) - calc(a - 1, d, k) - calc(b, c - 1, k) + calc(a - 1, c - 1, k); cout < < return 0; }

const int MOD = 20101009; const int MAXN = 1e7; int mu[MAXN + 1]; bool is_prime[MAXN + 1]; vector long long pre_sum[MAXN + 1]; // pre_sum[k] = sum_{i=1}^k mu[i] * i^2 mod MOD // 预处理莫比乌斯函数和 pre_sum void init() { memset(is_prime, true, sizeof(is_prime)); is_prime[0] = is_prime[1] = false; mu[1] = 1; for (int i = 2; i i) { if (is_prime[i]) { prime.push_back(i); mu[i] = -1; } for (int p : prime) { if (i * p > MAXN) break; is_prime[i * p] = false; if (i % p == 0) { mu[i * p] = 0; break; } else { mu[i * p] = mu[i] * mu[p]; } } } // 计算 pre_sum:mu[k] * k^2 mod MOD for (int k = 1; k k) { long long k2 = 1LL * k * k % MOD; pre_sum[k] = (pre_sum[k - 1] + 1LL * mu[k] * k2) % MOD; } // 处理负号(确保结果非负) for (int k = 1; k MAXN; ++k) { if (pre_sum[k] ) pre_sum[k] += MOD; } } // 计算 sum(1~n) mod MOD long long sum(long long n) { n %= MOD; return n * (n + 1) / 2 % MOD; } // 计算 S(A,B) long long compute_S(int A, int B) { if (A == 0 || B == 0) return 0; if (A > B) swap(A, B); long long res = 0; for (int l = 1, r; l r + 1) { r = min(A / (A / l), B / (B / l)); long long s = (pre_sum[r] - pre_sum[l - 1] + MOD) % MOD; long long sa = sum(A / l); long long sb = sum(B / l); res = (res + s * sa % MOD * sb % MOD) % MOD; } return res; } // 计算最终答案 long long solve(int n, int m) { if (n > m) swap(n, m); long long ans = 0; for (int l = 1, r; l ; l = r + 1) { r = min(n / (n / l), m / (m / l)); long long d_sum = (1LL * (l + r) * (r - l + 1) / 2) % MOD; // 求和 d from l to r long long s = compute_S(n / l, m / l); ans = (ans + d_sum * s % MOD) % MOD; } return ans; }

// 计算 sum_{d=1}^n f(d) * g( floor(n/d) ) long long divide_block(int n, function f, function(int)> g) { long long res = 0; for (int l = 1, r; l l = r + 1) { r = n / (n / l); long long f_sum = 0; for (int i = l; i ++i) f_sum += f(i); // 可预处理前缀和优化 res += f_sum * g(n / l); } return res; }

6.3 寄语​

莫比乌斯反演的核心是 “转化与优化”—— 将难以直接计算的问题转化为可通过数论性质快速求解的形式。初学者可能会被公式推导和代码实现劝退,但只要循序渐进(先掌握基础例题,再挑战进阶题),多动手推导公式、调试代码,就能逐渐体会其魅力。​

算法竞赛中,莫比乌斯反演常与整除分块、前缀和、线性筛结合出现,建议将这些知识点串联学习,形成完整的数论解题体系。祝你在数论的世界里越走越远!​

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 9:25:28

NBTExplorer:我的世界数据编辑的终极解决方案

NBTExplorer&#xff1a;我的世界数据编辑的终极解决方案 【免费下载链接】NBTExplorer A graphical NBT editor for all Minecraft NBT data sources 项目地址: https://gitcode.com/gh_mirrors/nb/NBTExplorer 你是否想过&#xff0c;为什么别人的我的世界存档里总有各…

作者头像 李华
网站建设 2026/4/15 16:03:42

FPGA教程系列-Vivado AXI4-Stream接口解读

FPGA教程系列-Vivado AXI4-Stream接口解读 俗话说&#xff0c;纸上得来终觉浅&#xff0c;理论看了半天可能都觉不出来有什么难的&#xff0c;上次仿真了一下AXI&#xff0c;跟实际的不一样&#xff0c;但是总归是动手了&#xff0c;大概知道了一些&#xff0c;现在就返回来重新…

作者头像 李华
网站建设 2026/4/15 21:43:04

3分钟学会百度网盘提取码一键获取:告别繁琐查询的终极方案

还在为百度网盘分享链接的提取码而四处奔波吗&#xff1f;每次遇到需要输入提取码的资源&#xff0c;都要在多个网页间来回切换&#xff0c;严重影响获取效率。baidupankey工具的出现彻底改变了这一现状&#xff0c;让百度网盘提取码一键获取变得前所未有的简单高效。 【免费下…

作者头像 李华
网站建设 2026/4/15 21:33:58

终极指南:文泉驿微米黑字体跨平台安装与高级配置完全攻略

终极指南&#xff1a;文泉驿微米黑字体跨平台安装与高级配置完全攻略 【免费下载链接】fonts-wqy-microhei Debian package for WenQuanYi Micro Hei (mirror of https://anonscm.debian.org/git/pkg-fonts/fonts-wqy-microhei.git) 项目地址: https://gitcode.com/gh_mirror…

作者头像 李华
网站建设 2026/4/16 11:00:25

基于JAVA的网上购物商城系统1cz5q351 商家

目录 已开发项目效果实现截图开发技术系统开发工具&#xff1a; 核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&am…

作者头像 李华
网站建设 2026/4/16 7:35:26

打造终极macOS应用商店:Applite免费开源图形化管理神器

还在为macOS软件安装烦恼吗&#xff1f;命令行操作让你望而却步&#xff1f;Applite横空出世&#xff0c;将复杂的Homebrew Cask命令行工具转化为直观易用的图形界面&#xff0c;让普通用户也能轻松管理第三方软件。这款开源应用彻底改变了macOS软件管理方式&#xff0c;让每个…

作者头像 李华