莫比乌斯函数及其反演

news/2025/1/16 16:26:26/文章来源:https://www.cnblogs.com/MoCy233/p/18675223

一些定义

数论函数
定义域为正整数的函数,一般分类如下:

  1. 积性函数
    对于 \(\forall x,y \in N , gcd(x,y)=1\) ,若 \(f(x \cdot y)=f(x) \cdot f(y)\) ,则 \(f\) 是积性函数。
  2. 完全积性函数
    对于 \(\forall x,y \in N\) ,若 \(f(x \cdot y)=f(x) \cdot f(y)\) ,则 \(f\) 是完全积性函数。
  3. 非积性函数

狄利克雷卷积
可以理解为数论函数的乘法,常用符号 \(*\) 表示。
\(f,g\) 均为数论函数,则有 \((f*g)(n) = \sum_{d|n}f(d)g(\frac{n}{d})\)
对于数论函数乘法,其单位元函数为 \(e\)

\[e(n) = \begin{cases} 1\ , n=1 \\ 0\ , n \ne 1 \end{cases} \]

即对于任意数论函数 \(f\) ,都有 \(f*e=f\)
狄利克雷卷积满足交换律和结合律

莫比乌斯函数

莫比乌斯函数 \(\mu\) 的定义如下:

\[\mu(n) = \begin{cases} 1\ , n=1 \\ 0\ , n包含平方因数 \\ (-1)^k\ ,k为n的本质不同质因子个数 \end{cases} \]

\(\mu\) 是积性函数。

性质

  1. \(\forall n \in N , \sum_{d|n}\mu(d) = [n=1]\)
    莫比乌斯反演中最常用的性质。
    推论:\(e(n) = \sum_{d|n}\mu(d) \Rightarrow e(n) = \sum_{d|n}\mu(d)1(\frac{n}{d}) \Rightarrow e=\mu*1\)
  2. \(\forall n \in N , \sum_{d|n}\frac{\mu(d)}{d} = \frac{\phi(n)}{n}\)

求莫比乌斯函数
由于 \(\mu\) 是积性函数,所以 \(\mu\) 可以像素数一样筛出来。
下面给出线性筛法:

void init(){memset(is_prime,1,sizeof is_prime);is_prime[1]=0; mu[1]=1;for (int i=2;i<=MAXN;i++){ //这里的MAXN注意边界if (!is_prime[i]) continue;prime[++cnt]=i;for (int j=1;j<=cnt&&1ll*i*prime[j]<=MAXN;j++){is_prime[i*prime[j]]=0;if (i%prime[j]==0) break; // mu在这个位置上本来就是0,不用额外赋值mu[i*prime[j]]=-mu[i]; // 质因子数+1,mu乘上-1}}return;
}

莫比乌斯反演

\[\textstyle g(n) = \sum_{d|n}f(d) \;\Leftrightarrow\; f(n) = \sum_{d|n}g(d)\mu(\frac{n}{d}) \]

证明
由性质一我们已知 \(e=\mu*1\)
\(g(n) = \sum_{d|n}f(d) \;\Rightarrow\; g(n) = \sum_{d|n}f(d)1(\frac{n}{d}) \;\Rightarrow\; g=f*1\)
将等式两边同乘 \(\mu\)\(g*\mu=f*(1*\mu) \;\Rightarrow\; g*\mu=f*e \;\Rightarrow\; f=g*\mu\)
于是 \(g(n) = \sum_{d|n}f(d) \;\Rightarrow\; f(n) = \sum_{d|n}g(d)\mu(\frac{n}{d})\) ,反之亦然。

例题(莫比乌斯函数及性质)

P3455 [POI2007] ZAP-Queries

给出 \(a,b,d\),求满足 \(1 \leq x \leq a\)\(1 \leq y \leq b\),且 \(\gcd(x,y)=d\) 的二元组 \((x,y)\) 的数量。
DATA:\(1 \leq n \leq 5 \times 10^4\)\(1 \leq d \leq a,b \leq 5 \times 10^4\)
Solution
答案可记作 \(Ans = \sum\limits_{i=1}^{a}\sum\limits_{j=1}^{b}[\gcd(x,y)=d]\)\(a\leq b\)
\(\because \gcd(\alpha,\beta)=1 \;\Rightarrow\; \gcd(\alpha c,\beta c)=c\)
\( \begin{aligned} \therefore Ans &= \textstyle\sum\limits_{i=1}^{\lfloor\frac{a}{d}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{b}{d}\rfloor}[\gcd(x,y)=1]\\&= \textstyle\sum\limits_{i=1}^{\lfloor\frac{a}{d}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{b}{d}\rfloor}\sum_{d'|\gcd(x,y)}\mu(d') (性质一)\\&= \textstyle\sum\limits_{d'=1}^{\lfloor\frac{a}{d}\rfloor}\mu(d')\lfloor\frac{\lfloor\frac{a}{d}\rfloor}{d'}\rfloor\lfloor\frac{\lfloor\frac{b}{d}\rfloor}{d'}\rfloor (枚举d',交换求和顺序) \end{aligned} \)
由此复杂度可降至 \(O(na)\) ,但依旧不足以通过此题。
考虑数论分块,也就是把 \(\lfloor\frac{\lfloor\frac{a}{d}\rfloor}{d'}\rfloor\lfloor\frac{\lfloor\frac{b}{d}\rfloor}{d'}\rfloor\) 相同的项合并起来算,乘与 \(\sum\limits_{d'=start}^{end}\mu(d')\) 即可,这部分用前缀和。

Code
#include <bits/stdc++.h>
#define MAXN 100003
using namespace std;
int T;
int x,y,d;
int is_prime[MAXN];
int prime[MAXN]; int cnt;
int mu[MAXN];
long long sum[MAXN];
void init(){for (int i=1;i<=MAXN-2;i++) is_prime[i]=1;is_prime[1]=0; is_prime[2]=1; mu[1]=1;for (int i=2;i<=MAXN-2;i++){ // 数据范围不大,这里是nlogn筛if (!is_prime[i]) continue;mu[i]=-1;int j=2;while (1ll*i*j<=MAXN-2){is_prime[i*j]=0;if (j%i==0) mu[i*j]=0;else mu[i*j]=mu[i]*mu[j];j++;}}for (int i=1;i<=MAXN-2;i++) if (is_prime[i]) prime[++cnt]=i;for (int i=1;i<=MAXN-2;i++) sum[i]=sum[i-1]+mu[i];return;
}
int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);init();cin>>T;while (T--){cin>>x>>y>>d;int N=x/d,M=y/d;long long ans=0;for (int d2=1;d2<=min(N,M);d2++){int nxt=min(N/(N/d2),M/(M/d2));ans+=1ll*(sum[nxt]-sum[d2-1])*(N/d2)*(M/d2);d2=nxt;}cout<<ans<<'\n';}return 0;
}

P2522 [HAOI2011] Problem b

对于给出的 \(n\) 个询问,每次求有多少个数对 \((x,y)\),满足 \(a \le x \le b\)\(c \le y \le d\),且 \(\gcd(x,y) = k\)\(\gcd(x,y)\) 函数为 \(x\)\(y\) 的最大公约数。
DATA:\(1 \le n,k \le 5 \times 10^4\)\(1 \le a \le b \le 5 \times 10^4\)\(1 \le c \le d \le 5 \times 10^4\)
Solution
与上题相似,加一个容斥即可。

Code
#include <bits/stdc++.h>
#define MAXN 100003
using namespace std;
int T;
int a,b,c,d,k;
int is_prime[MAXN];
int prime[MAXN]; int cnt;
int mu[MAXN];
long long sum[MAXN];
void init(){for (int i=1;i<=MAXN-2;i++) is_prime[i]=1;is_prime[1]=0; is_prime[2]=1; mu[1]=1;for (int i=2;i<=MAXN-2;i++){ //数据范围小我就不用线性筛if (!is_prime[i]) continue;mu[i]=-1;int j=2;while (1ll*i*j<=MAXN-2){is_prime[i*j]=0;if (j%i==0) mu[i*j]=0;else mu[i*j]=mu[i]*mu[j];j++;}}for (int i=1;i<=MAXN-2;i++) if (is_prime[i]) prime[++cnt]=i;for (int i=1;i<=MAXN-2;i++) sum[i]=sum[i-1]+mu[i];return;
}
int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);init();cin>>T;while (T--){cin>>a>>b>>c>>d>>k;int N=b/k,M=d/k;long long ans1=0,ans2=0,ans3=0,ans4=0;for (int d2=1;d2<=min(N,M);d2++){int nxt=min(N/(N/d2),M/(M/d2));ans1+=1ll*(sum[nxt]-sum[d2-1])*(N/d2)*(M/d2);d2=nxt;}N=(a-1)/k; M=d/k;for (int d2=1;d2<=min(N,M);d2++){int nxt=min(N/(N/d2),M/(M/d2));ans2+=1ll*(sum[nxt]-sum[d2-1])*(N/d2)*(M/d2);d2=nxt;}N=(c-1)/k; M=b/k;for (int d2=1;d2<=min(N,M);d2++){int nxt=min(N/(N/d2),M/(M/d2));ans3+=1ll*(sum[nxt]-sum[d2-1])*(N/d2)*(M/d2);d2=nxt;}N=(a-1)/k; M=(c-1)/k;for (int d2=1;d2<=min(N,M);d2++){int nxt=min(N/(N/d2),M/(M/d2));ans4+=1ll*(sum[nxt]-sum[d2-1])*(N/d2)*(M/d2);d2=nxt;}cout<<ans1-ans2-ans3+ans4<<'\n';}return 0;
}

P2257 YY的GCD

给定 \(N, M\),求 \(1 \leq x \leq N\)\(1 \leq y \leq M\)\(\gcd(x, y)\) 为质数的 \((x, y)\) 有多少对。
DATA:\(T = 10^4\)\(N, M \leq 10^7\)
Solution
只需要稍微退推一下柿子(,
\(N \leq M\)
\( \begin{aligned} Ans &= \textstyle\sum\limits_{p \in prime}^{N}\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{M}[\gcd(i,j)=p]\\&= \textstyle\sum\limits_{p \in prime}^{N}\sum\limits_{i=1}^{\lfloor\frac{N}{p}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{M}{p}\rfloor}[\gcd(i,j)=1] \\&= \textstyle\sum\limits_{p \in prime}^{N}\sum\limits_{i=1}^{\lfloor\frac{N}{p}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{M}{p}\rfloor}\sum_{d|\gcd(i,j)}\mu(d) \\&= \textstyle\sum\limits_{p \in prime}^{N}\sum\limits_{d=1}^{\lfloor\frac{N}{p}\rfloor}\mu(d)*\lfloor\frac{N}{pd}\rfloor*\lfloor\frac{M}{pd}\rfloor \\ \end{aligned} \)
\(T=pd\)\(d=\frac{T}{p}\)
\( \begin{aligned} Ans &= \textstyle\sum\limits_{p \in prime}^{N}\sum\limits_{d=1}^{\lfloor\frac{N}{p}\rfloor}\mu(\frac{T}{p})*\lfloor\frac{N}{T}\rfloor*\lfloor\frac{M}{T}\rfloor \\&= \textstyle\sum\limits_{T=1}^{N}\lfloor\frac{N}{T}\rfloor\lfloor\frac{M}{T}\rfloor\sum\limits_{p|T,p \in prime}\mu(\frac{T}{p}) (枚举T,交换求和顺序) \\ \end{aligned} \)
这下前面一部分可以用数论分块做,后半部分枚举 \(p\) 计算对 \(T\) 的贡献即可。
时间复杂度 \(O(n+T\sqrt{n})\)

Code
#include <bits/stdc++.h>
#define MAXN 10000003
using namespace std;
int T;
int n,m;
int is_prime[MAXN],prime[MAXN],cnt;
int mu[MAXN],sum[MAXN];
long long f[MAXN],sumf[MAXN];
void init(){for (int i=2;i<=MAXN-2;i++) is_prime[i]=1;mu[1]=1;for (int i=2;i<=MAXN-2;i++){ //nlogn筛似了,换成线性筛if (is_prime[i]){prime[++cnt]=i;mu[i]=-1;}for (int j=1;j<=cnt&&1ll*i*prime[j]<=MAXN-2;j++){is_prime[i*prime[j]]=0;if (i%prime[j]==0) break;mu[i*prime[j]]=-mu[i];}}for (int i=1;i<=MAXN-2;i++) sum[i]=sum[i-1]+mu[i];for (int i=1;i<=cnt;i++){for (int j=1;j<=MAXN-2&&1ll*prime[i]*j<=MAXN-2;j++){ //计算质数p对T的贡献f[prime[i]*j]+=mu[j];}}for (int i=1;i<=MAXN-2;i++) sumf[i]=sumf[i-1]+f[i];return;
}
int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);init();cin>>T;while (T--){cin>>n>>m;if (n>m) swap(n,m);long long ans=0;for (int T=1;T<=n;T++){int nxt=min(n/(n/T),m/(m/T));ans+=1ll*(n/T)*(m/T)*(sumf[nxt]-sumf[T-1]);T=nxt;}cout<<ans<<'\n';}return 0;
}

例题(真正的莫比乌斯反演)

P5518 [MtOI2019] 幽灵乐团 / 莫比乌斯反演基础练习题

\[\prod_{i=1}^{A}\prod_{j=1}^{B}\prod_{k=1}^{C}\left(\frac{\text{lcm}(i,j)}{\gcd(i,k)}\right)^{f(type)} (mod\ p) \]

\[\begin{aligned} f(0)&=1 \cr f(1)&=i \times j \times k \cr f(2)&=\gcd(i,j,k) \end{aligned}\]

DATA:$$ 1\leq A,B,C\leq 10^5 \ \ \ \ 10^7 \leq p \leq 1.05\times 10^9\ \ \ \ p\in { prime} \ \ \ \ T =70$$

其它东西

题单

莫比乌斯反演(函数)练习题单

参考资料

【数论】莫比乌斯函数/莫比乌斯反演
数论小白入门-- 莫比乌斯反演
【数论】莫比乌斯函数及其反演
莫比乌斯函数
关于n,欧拉函数与莫比乌斯函数的互化

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

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

相关文章

飞机电气系统技术分析:数字样机技术引领创新

现代飞机正向着更安全、环保和经济的方向发展,飞机系统的设计日益复杂,对各子系统的性能和可靠性也提出了更高要求。作为飞机的重要组成部分,电气系统(Electrical System,ES)不仅负责为各类机载设备提供稳定的电力支持,还在飞行控制、导航、通讯以及乘客舒适性等方面发挥…

Go操作MongoDB

NoSQL泛指非关系型数据库,如mongo,redis,HBase。 mongo使用高效的二进制数据存储,文件存储格式为 BSON ( 一种json的扩展,比json性能更好,功能更强大)。 MySQL中表的概念在mongo里叫集合(collection), MySQL中行的概念在mongo中叫文档(document),一个文档看上去像一个j…

2025年实战技巧!如何通过项目管理助力产品经理实现产品目标?

在当今竞争激烈的商业环境中,产品经理不仅要负责产品的整体规划和设计,还需要确保项目能够按时、按质、按预算完成。这就需要产品经理具备出色的项目管理能力。本文将深入探讨如何通过项目管理助力产品经理实现产品目标,并提供2025年的实战技巧。引言 随着市场的不断变化和技…

Polygon-funky

E. Polygon 给定一个数 n,生成一个 nn 的一个全为 0 的初始矩阵,矩阵上方和左方均有一排炮台,矩阵的下边和右边是边界 炮台可以发射子弹,子弹只能直线行走,且遇到边界后会停止,遇到一个停止的子弹也会停止,子弹停止后的坐标里面的值记为 1 在任何时候,都不会有超过一门…

2025四款简单好用的电脑便签提醒软件推荐

进入2025年,越来越多的打工人需要在电脑上使用一款桌面便签或日程提醒软件,随时记录和管理工作事项,能够帮助我们高效整理思绪,确保重要事务不被遗漏。 今天给大家介绍四款简单又好用的电脑便签或日程提醒软件,总有一款是适合你的! 一、Win系统便笺 Windows操作系统自带的…

本次小论文minor revision中的知识积累

可以发邮件向编辑申请延期返修截止日期 https://cn.service.elsevier.com/app/answers/detail/a_id/29653/c/10595/supporthub/publishing/role/作者/ https://zhuanlan.zhihu.com/p/577324425申请邮件模板:如何在Editorial Manager系统中提交修改稿?【爱思唯尔Editorial Man…

多通道传感器接入集中控制频率温度 传感器集线器带来更多方便

多通道传感器接入集中控制频率温度 传感器集线器带来更多方便现场传感器太多,编号容易混乱?传感器集线器可以将多路传感器轮流切换到单一接口,为现场提供更多方便。操作简便直观,使用一个百位拨动开关和两个旋转开关(十位和个位)自由切换到任意传感器。 传感器通道多,最…

实战指南:优化采购流程,实现高效采购管理

优化采购流程需要从多个方面入手,包括明确采购需求、加强供商管理、优化采购谈判与合同签订、加强采购执行与跟踪、提高质量控制与验收水平、进行成本分析与优化、加强人员培训与发展以及注重合规与风险管理。通过这些措施的实施,可以显著提高采购效率和质量,降低采购成本,…

Lableview 标签软件 | LABELVIEW 条形码标签软件

Lableview 标签软件 | LABELVIEW 条形码标签软件Lableview 专业顾问 手机|微信:13928851814值得您信赖的条形码标签软件稳健可靠的条形码标签创建与集成简单的数据库连接易于使用的界面和提供便利的向导100 多种条形码符号体系可自定义的打印界面变量选用表增加了灵活性LABE…

原生JS实现一个日期选择器(DatePicker)组件

这是通过原生HTML/CSS/JavaScript完成一个日期选择器(datepicker)组件,一个纯手搓的组件的开发。主要包括datepicker静态结构的编写、日历数据的计划获取、组件的渲染以及组件事件的处理。 根据调用时的时间格式参数,可以控制短日期格式或长日期格式。实现效果(短日期格式…

LabelMatrix 标签软件 | LABEL MATRIX 条形码标签软件

LabelMatrix 标签软件 | LABEL MATRIX 条形码标签软件LabelMatrix 专业顾问 手机|微信:13928851814LABEL MATRIX 条形码标签软件 借助功能丰富的条形码标签软件,为将来的发展奠定坚实的基础适用于简单标签需求的条形码标签软件提供帮助的内置向导熟悉的 Windows 用户界面10…

《操作系统真相还原》实验记录2.5——线程实现

本文章实现内容如下: 1. 实现单线程的创建功能 2. 实现多线程调度的基本功能,包含:时钟中断处理函数;任务调度器;任务切换函数;零、项目说明本项目仓库现已公开,地址:GitHub:-HC-OS-操作系统设计项目 本项目当前进度:已完成多线程调度基础功能;一、前置知识点 1.1 …