当前位置: 首页 > news >正文

莫比乌斯反演学习笔记

概念

莫比乌斯函数 μ(n)\mu(n)μ(n),是一个积性函数,定义为:
μ(n)={1,n=10,nisdivisiblebythesquareofaprimenumber(−1)k,kisthenumberofprimefactorsofn\mu(n)=\begin{cases}1,n=1\\ 0,n\;is\;divisible\;by\;the\;square\;of\;a\;prime\;number\\ (-1)^k,k\;is\;the\;number\;of\;prime\;factors\;of\;n \end{cases}μ(n)=1,n=10,nisdivisiblebythesquareofaprimenumber(1)k,kisthenumberofprimefactorsofn

其性质有:一、∑d∣nμ(d)=[n=1]\sum_{d|n}\mu(d)=[n=1]dnμ(d)=[n=1];二、μ∗1=ϵ\mu*1=\epsilonμ1=ϵ,其中 ∗* 表示狄利克雷卷积,ϵ=[n=1]\epsilon=[n=1]ϵ=[n=1](其实这条与一等价)

莫比乌斯反演的形式有二:一、设 F(n)=∑n∣mf(m)F(n)=\sum_{n|m}f(m)F(n)=nmf(m),有 f(n)=∑n∣mF(m)μ(mn)f(n)=\sum_{n|m}F(m)\mu(\frac{m}{n})f(n)=nmF(m)μ(nm);二、设 F(n)=∑m∣nf(m)F(n)=\sum_{m|n}f(m)F(n)=mnf(m),有 f(n)=∑m∣nF(nm)μ(m)=∑m∣nF(m)μ(nm)f(n)=\sum_{m|n}F(\frac{n}{m})\mu(m)=\sum_{m|n}F(m)\mu(\frac{n}{m})f(n)=mnF(mn)μ(m)=mnF(m)μ(mn)

例题

1. Luogu P2257 YY的GCD

题意

给定 N,MN, MN,M,求 1≤x≤n1 \leq x \leq n1xn1≤y≤m1 \leq y \leq m1ymgcd⁡(x,y)\gcd(x, y)gcd(x,y) 为质数的 (x,y)(x, y)(x,y) 有多少对。

T=104;n,m≤107T = 10^4;\;n, m \leq 10^7T=104;n,m107

做法

f(p)=∑x=1n∑y=1m[gcd⁡(x,y)=p];F(p)=∑p∣qf(q)=⌊np⌋⌊mp⌋;L=min⁡(n,m)f(p)=\sum_{x=1}^n\sum_{y=1}^m[\gcd(x, y)=p]; F(p)=\sum_{p|q}f(q)=\lfloor\frac{n}{p}\rfloor\lfloor\frac{m}{p}\rfloor; L=\min(n,m)f(p)=x=1ny=1m[gcd(x,y)=p];F(p)=pqf(q)=pnpm;L=min(n,m)

即求:

∑p∈Primef(p)=∑p∈Prime∑p∣xF(x)μ(xp)=∑p∈Prime∑i=1L/p⌊nip⌋⌊mip⌋μ(i)=∑T=1L⌊nT⌋⌊mT⌋∑p∣T&p∈Primeμ(Tp)\sum_{p\in Prime}f(p)\\ =\sum_{p\in Prime}\sum_{p|x}F(x)\mu(\frac{x}{p})\\ =\sum_{p\in Prime}\sum_{i=1}^{L/p}\lfloor\frac{n}{ip}\rfloor\lfloor\frac{m}{ip}\rfloor\mu(i)\\ =\sum_{T=1}^{L}\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor\sum_{p|T\;\&\;p\in Prime}\mu(\frac{T}{p})pPrimef(p)=pPrimepxF(x)μ(px)=pPrimei=1L/pipnipmμ(i)=T=1LTnTmpT&pPrimeμ(pT)

重点在于求 g(x)≜∑p∣x&p∈Primeμ(xp)g(x)\triangleq\sum_{p|x\;\&\;p\in Prime}\mu(\frac{x}{p})g(x)px&pPrimeμ(px)pppxxx 的一个质因数,考虑通过某种顺序枚举 xxx 的质因数,发现线性筛的过程会将 xxx 拆成一个最小的质因数和另一个数的乘积,即 x=y⋅p,p∈Primex=y\cdot p,\;p\in Primex=yp,pPrime,则有:
g(x)={μ(1),x∈Primeg(y),pisafactorofy−g(y)+μ(y),pisnotafactorofyg(x)=\begin{cases}\mu(1),\;x\in Prime\\ g(y),\;p\;is\;a\;factor\;of\;y\\ -g(y)+\mu(y),\;p\;is\;not\;a\;factor\;of\;y\;\end{cases}g(x)=μ(1),xPrimeg(y),pisafactorofyg(y)+μ(y),pisnotafactorofy
需要注意从 −g(y)-g(y)g(y) 转移因为 g(y)g(y)g(y) 所包含的 μ\muμg(x)g(x)g(x) 所包含的 μ\muμ 差一个因子 ppp

代码
#include <bits/stdc++.h>const int N = 1e7;int mu[N + 2], prime[N + 2], top, sum[N + 2];
bool nprime[N + 2];void solve() {int n, m;std::cin >> n >> m;long long ans = 0;for (int l = 1, r; l <= std::min(n, m); l = r + 1) {r = std::min(n / (n / l), m / (m / l));ans += 1ll * (n / l) * (m / l) * (sum[r] - sum[l - 1]);}std::cout << ans << '\n';
}int main() {std::ios::sync_with_stdio(0);std::cin.tie(0);std::cout.tie(0);mu[1] = 1;for (int i = 2; i <= N; i++) {if (!nprime[i]) {prime[++top] = i;mu[i] = -1;sum[i] = 1;}for (int j = 1; j <= top && 1ll * i * prime[j] <= N; j++) {int now = i * prime[j];nprime[now] = 1;if (i % prime[j] == 0) {mu[now] = 0;sum[now] = mu[i];break;}mu[now] = -mu[i];sum[now] = mu[i] - sum[i];}}for (int i = 1; i <= N; i++) {sum[i] += sum[i - 1];}int t;std::cin >> t;while (t--) {solve();}
}

2. Luogu P2522 [HAOI2011] Problem b

题意

对于给出的 nnn 个询问,每次求有多少个数对 (x,y)(x,y)(x,y),满足 a≤x≤ba \le x \le baxbc≤y≤dc \le y \le dcyd,且 gcd⁡(x,y)=k\gcd(x,y) = kgcd(x,y)=k

1≤n,k≤5×1041 \le n,k \le 5 \times 10^41n,k5×1041≤a≤b≤5×1041 \le a \le b \le 5 \times 10^41ab5×1041≤c≤d≤5×1041 \le c \le d \le 5 \times 10^41cd5×104

做法

(这个感觉比上面一个更加板子)

可以 a′←⌈ak⌉,b′←⌊bk⌋a'\gets\lceil\frac{a}{k}\rceil,\;b'\gets\lfloor\frac{b}{k}\rflooraka,bkb 这样操作把 kkk 转换为 111,然后对于两个区间可以容斥为 res(b′,d′)−res(a′−1,d′)−res(b′,c′−1)+res(a′−1,c′−1)res(b',d')-res(a'-1,d')-res(b',c'-1)+res(a'-1,c'-1)res(b,d)res(a1,d)res(b,c1)+res(a1,c1)。即求 ∑x=1n∑y=1m[gcd⁡(x,y)=1]=∑i=1min⁡(n,m)⌊ni⌋⌊mi⌋μ(i)\sum_{x=1}^{n}\sum_{y=1}^{m}{[\gcd(x,y)=1]}=\sum_{i=1}^{\min(n,m)}\lfloor\frac{n}{i}\rfloor\lfloor\frac{m}{i}\rfloor\mu(i)x=1ny=1m[gcd(x,y)=1]=i=1min(n,m)inimμ(i)

代码
#include <bits/stdc++.h>const int N = 5e4;int mu[N + 2], prime[N + 2], top, sum[N + 2];
bool nprime[N + 2];long long work(int n, int m) {long long ans = 0;if (n > m) {std::swap(n, m);}for (int l = 1, r; l <= n; l = r + 1) {r = std::min(n / (n / l), m / (m / l));ans += 1ll * (n / l) * (m / l) * (sum[r] - sum[l - 1]);}return ans;
}void solve() {int a, b, c, d, k;std::cin >> a >> b >> c >> d >> k;a = (a + k - 1) / k;c = (c + k - 1) / k;b = b / k;d = d / k;std::cout << (work(b, d) - work(a - 1, d) - work(b, c - 1) + work(a - 1, c - 1)) << '\n';
}int main() {std::ios::sync_with_stdio(0);std::cin.tie(0);std::cout.tie(0);mu[1] = 1;for (int i = 2; i <= N; i++) {if (!nprime[i]) {prime[++top] = i;mu[i] = -1;}for (int j = 1; j <= top && 1ll * i * prime[j] <= N; j++) {int now = i * prime[j];nprime[now] = 1;if (i % prime[j] == 0) {mu[now] = 0;break;}mu[now] = -mu[i];}}for (int i = 1; i <= N; i++) {sum[i] = sum[i - 1] + mu[i];}int t;std::cin >> t;while (t--) {solve();}
}
http://www.lryc.cn/news/614967.html

相关文章:

  • FFMPEG将H264转HEVC时,码率缩小多少好,以及如何通过SSIM(Structural Similarity Index结构相似性指数)衡量转码损失
  • PDF编辑工具,免费OCR识别表单
  • .htaccess 文件上传漏洞绕过总结
  • springBoot集成easyExcel 实现文件上传
  • linux安装php
  • 模板引擎art-template
  • 深入剖析Spring MVC核心原理:从请求到响应的魔法解密
  • AI 算法优化实战指南:从理论到部署的全流程优化策略
  • K-means聚类学习:原理、实践与API解析
  • 从反射到方法句柄:深入探索Java动态编程的终极解决方案
  • 从零玩转Linux云主机:免费申请、连接终端、命令速查表
  • 灾后食物能源协调供应优化模型
  • 《算法导论》第 15 章 - 动态规划
  • 基于开源AI大模型、AI智能名片与S2B2C商城小程序的学习型社群构建与运营模式创新研究
  • rem:CSS中的相对长度单位
  • IntelliJ IDEA 新手全方位使用指南
  • 网站站长如何借助php推送示例提交网站内容加速百度收录?
  • webwork的学习
  • 7天精通Coze智能体实操手册(Day 1)
  • Go语言实战案例:表单提交数据解析
  • Express中间件和路由及响应方法
  • golang的二维数组
  • vulnhub-Beelzebub靶场通关攻略
  • Nginx 功能扩展与二次开发实践
  • 目标检测数据集 - 无人机检测数据集下载「包含COCO、YOLO两种格式」
  • 1.JavaScript 介绍
  • 130Kw双向储能PCS电源及关键技术分析
  • 彻底解决vscode中fnm调用失败的问题
  • 嵌入式 Linux Mender OTA 实战全指南
  • Microsoft 365中的Message Encryption (Basic)功能深度解析