莫比乌斯反演 笔记

news/2025/2/11 16:02:39/文章来源:https://www.cnblogs.com/Garbage-fish/p/18709901

本文原在 2024-03-11 13:50 发布于本人洛谷博客。

一、莫比乌斯函数

1. 定义

\(n=p_1^{t_1}p_2^{t_2}p_3^{t_3}\dots p_k^{t_k}\),其中 \(p_i\)\(n\) 的互异质因子。

\(\mu(n)=\left\{\begin{matrix} (-1)^q& t_i=1\\ 1&n=1\\ 0&\text{Otherwise.} \end{matrix}\right.\)

2. 性质

性质一:若\(n\ne 1\),则 \(\sum_{d|n}\mu(d)=0\)

\(n=p_1^{t_1}p_2^{t_2}p_3^{t_3}\dots p_k^{t_k}\),其中 \(p_i\)\(n\) 的互异质因子。

因为 \(d|n\),所以 \(d\) 是由 \(n\) 的质因子中选择若干个相乘得到的。

如果 \(d\) 是由一个以上相同的质因子组成的,则 \(\mu(d)=0\),所以只有在 \(p_1\)\(p_q\) 间选择若干个组成 \(d\),才会对答案有贡献。

若选择 \(i\) 个质因子,则方案数为 \(C_q^i\),贡献为 \((-1)^iC_q^i\)

所以:

\[\sum_{d|n}\mu(d)=\sum_{i=0}^q(-1)^iC_q^i \]

由组合数知识可知 \(\sum_{i|2}C_q^i=\sum_{i\nmid 2}C_q^i\)

所以:

\[\sum_{i=0}^q(-1)^iC_q^i=0 \]

性质二:\(\mu(x)\) 是积性函数

\(a\)\(b\) 互质,且 \(a\) 的质因子后有 \(p\) 项,\(b\) 的有 \(q\) 项。

\(\mu(a)\)\(\mu(b)\) 均不为 \(0\) 时,那么明显 \(ab\) 的质因子有 \(p+q\) 项,因为 \((-1)^{p+q}=(-1)^p(-1)^q\),所以 \(\mu(ab)=\mu(a)\mu(b)\)

\(\mu(a)\)\(\mu(b)\) 至少有一项为 \(0\) 时,那么明显 \(ab\) 也会有重复的质因子,所以 \(\mu(ab)=0=\mu(a)\mu(b)\)

二、莫比乌斯反演的套路

没有算法,全是套路。

1. P3455 [POI2007] ZAP-Queries

求式子:

\[\sum_{i=1}^{a}\sum_{j=1}^{b}[\gcd(i,j)=d] \]

为书写简便,假设式子中的 \(a\le b\)。下文中的 \(x/y\) 均表示 \(\left\lfloor\frac{x}{y}\right\rfloor\)

套路一:将 \(\gcd(i,j)=d\) 化为 \(\gcd(i,j)=1\)

全部同时除以 \(d\) 即可。

\[\sum_{i=1}^{a/d}\sum_{j=1}^{b/d}[\gcd(i,j)=1] \]

套路二:运用莫比乌斯函数的性质一转换

由性质一,可得若 \(n=1\),则 \(\sum_{d|n}\mu(d)=1\),所以,将 \([\gcd(i,j)=1]\) 转换一下:

\[\sum_{i=1}^{a/d}\sum_{j=1}^{b/d}\sum_{x|\gcd(i,j)}\mu(x) \]

套路三:将 \(x\) 的和号改为枚举 \(x\) 的形式

因为 \(x\le \gcd(i,j)\),所以 \(x\le\min(a/d,b/d)\),如果 \(x|\gcd(i,j)\),那么 \([x|gcd(i,j)]=1\),所以:

\[\sum_{i=1}^{a/d}\sum_{j=1}^{b/d}\sum_{x=1}^{a/d}\mu(x)[x|\gcd(i,j)] \]

套路四:让每个函数都只和他前面的和号有关系

容易发现 \(\mu(x)\) 和前两个和号没有半毛钱关系,直接提前,所以:

\[\sum_{x=1}^{a/d}\mu(x)\sum_{i=1}^{a/d}\sum_{j=1}^{b/d}[x|\gcd(i,j)] \]

套路五:把判断整除 \(\gcd\) 拆开

容易发现 \([x|\gcd(i,j)]\) 一部分等价于 \([x|i\wedge x|j]\),也就是 \([x|i][x|j]\)

\[\sum_{x=1}^{a/d}\mu(x)\sum_{i=1}^{a/d}\sum_{j=1}^{b/d}[x|i][x|j] \]

此时再用一下套路四:

\[\sum_{x=1}^{a/d}\mu(x)\sum_{i=1}^{a/d}[x|i]\sum_{j=1}^{b/d}[x|j] \]

套路六:把判断整除拆开

\(\sum_{i=1}^{a/d}[x|i]\) 就是求 \(1\sim a/d\) 中,\(x\) 的倍数的个数,明显可以直接用 \(a/d/x\) 求出,所以:

\[\sum_{x=1}^{a/d}\mu(x)(a/d/x)(b/d/x) \]

至此,化简完成,\(\sum_{x=1}^{a/d}\mu(x)\) 可以用前缀和求出,后面的部分可以用整除分块求出。

Code:

#include <bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
using namespace std;
const int N=1e5+10;
int n,a,b,c,d,k,ans,q[N];
namespace Mu{int prime[N],tot,mu[N];bool isprime[N];void getmu(int x){memset(isprime,true,sizeof isprime);isprime[1]=false;mu[1]=1;for(int i=2;i<=x;i++){if(isprime[i]){prime[++tot]=i;mu[i]=-1;}for(int j=1;j<=tot and i*prime[j]<=x;j++){isprime[i*prime[j]]=false;if(!(i%prime[j]))break;mu[i*prime[j]]=-mu[i];}}}
}using namespace Mu;
signed main(){IOS;getmu(5e4);for(int i=1;i<=5e4;i++)q[i]=q[i-1]+mu[i];cin>>n;while(n--){cin>>a>>b>>k;a/=k;b/=k;if(a>b)swap(a,b);ans=0;for(int l=1,r;l<=a;l=r+1){r=min(a/(a/l),b/(b/l));ans+=(q[r]-q[l-1])*(a/l)*(b/l);}cout<<ans<<"\n";}return 0;
}

2. P4449 于神之怒加强版

求式子:

\[\sum_{i=1}^n\sum_{j=1}^m\gcd(i,j)^k \]

套路七:将求值部分改为枚举取值并乘上合法个数

显然的,上面的式子可以枚举 \(\gcd(i,j)\) 的值,假设 \(d=\gcd(i,j)\),那么就可以化简为:

\[\sum_{i=1}^n\sum_{j=1}^m\sum_{d=1}^{n}d^k[\gcd(i,j)=d] \]

此时,运用套路四:

\[\sum_{d=1}^nd^k\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=d] \]

发现后半部分跟上一题一模一样,直接运用上一题相同的方法化简:

\[\sum_{d=1}^nd^k\sum_{x=1}^{n/d}\mu(x)(n/d/x)(m/d/x) \]

套路八:运用向上/下取整的性质化简。

性质:

\[\left\lfloor\frac{a}{\left\lfloor\frac{b}{c}\right\rfloor}\right\rfloor=\left\lfloor\frac{a}{bc}\right\rfloor,\left\lceil\frac{a}{\left\lceil\frac{b}{c}\right\rceil}\right\rceil=\left\lceil\frac{a}{bc}\right\rceil \]

所以:

\[\sum_{d=1}^nd^k\sum_{x=1}^{n/d}\mu(x)(n/(dx))(m/(dx)) \]

套路九:分母出现两个枚举的数的积时,改为枚举这个积

\(T=dx\),所以:

\[\sum_{T=1}^n(n/T)(m/T)\sum_{d|T}d^k\mu(\frac{T}{d}) \]

此时,只要求出后半部分 \(\sum_{d|T}d^k\mu(\frac{T}{d})\) 就好了。

\(f(T)=\sum_{d|T}d^k\mu(\frac{T}{d})\),很容易可以得到这是一个积性函数,所以将 \(T\) 分解质因子,\(T=p_1^{t_1}p_2^{t_2}p_3^{t_3}\dots p_q^{t_q}\),那么由积性函数的性质:

\[f(T)=\prod_{i=1}^qf(p_i^{t_i})=\prod_{i=1}^qp_i^{k(t_i-1)}\mu(p_i)+p_i^{kt_i}\mu(1)=\prod_{i=1}^qp_i^{k(t_i-1)}+p_i^{kt_i} \]

于是就可以线性筛了,原式变为:

\[\sum_{T=1}^n(n/T)(m/T)f(T) \]

使用整除分块解决。

3. P1829 [国家集训队] Crash的数字表格 / JZPTAB

求式子:

\[\sum_{i=1}^n\sum_{j=1}^m\text{lcm}(i,j) \]

运用 \(\text{lcm}(a,b)=\frac{ab}{\gcd(a,b)}\) 的关系,很容易可以得到:

\[\sum_{i=1}^n\sum_{j=1}^m\frac{ij}{\gcd(i,j)} \]

运用套路七:

\[\sum_{d=1}^n\sum_{i=1}^n\sum_{j=1}^mij/d[\gcd(i,j)=d] \]

运用套路一,但是出现了一个没见过的 \(ij/d\),设 \(i'=i/d,j'=j/d\),则:

\[ij/d=i'dj'd/d=i'j'd \]

所以:

\[\sum_{d=1}^n\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}ijd[\gcd(i,j)=1] \]

运用套路二;

\[\sum_{d=1}^n\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}\sum_{x|\gcd(i,j)}ijd\mu(x) \]

运用套路三:

\[\sum_{d=1}^n\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}\sum_{x=1}^{n/d}ijd\mu(x)[x|\gcd(i,j)] \]

运用套路四:

\[\sum_{d=1}^nd\sum_{x=1}^{n/d}\mu(x)\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}ij[x|\gcd(i,j)] \]

运用套路五:

\[\sum_{d=1}^nd\sum_{x=1}^{n/d}\mu(x)\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}ij[x|i][x|j] \]

套路十:将整除中的除数化为 \(1\)

因为 \([1|p]=1\),所以这样做可以直接化简掉 \([x|p]\) 这样的东西,所以我们在和号的边界里除掉一个 \(x\),再在求值里乘回一个 \(x\)

\[\sum_{d=1}^nd\sum_{x=1}^{n/d}\mu(x)\sum_{i=1}^{n/d/x}\sum_{j=1}^{m/d/x}ijx^2[1|i][1|j] \]

\[\sum_{d=1}^nd\sum_{x=1}^{n/d}\mu(x)\sum_{i=1}^{n/d/x}\sum_{j=1}^{m/d/x}ijx^2 \]

再次运用套路四:

\[\sum_{d=1}^nd\sum_{x=1}^{n/d}\mu(x)x^2\sum_{i=1}^{n/d/x}i\sum_{j=1}^{m/d/x}j \]

后面两个和号明显就是一个等差数列,直接变成式子:

\[\sum_{d=1}^nd\sum_{x=1}^{n/d}\mu(x)x^2\frac{(1+n/d/x)(n/d/x)}{2}\frac{(1+m/d/x)(m/d/x)}{2} \]

化简完成,但是这式子也太抽象了,根本没法求,想办法通过用多几个函数来表示方便一点:

观察到第二个和号开始后面的部分可以用整除分块求,那么定义一个函数 \(f(p,q)\) 表示该部分:

\[f(p,q)=\sum_{x=1}^{p}\mu(x)x^2\frac{(1+p/x)(p/x)}{2}\frac{(1+q/x)(q/x)}{2} \]

观察到最后的两个分式可以 \(O(1)\) 求,那么定义一个函数 \(g(p,q)\) 表示该部分:

\[g(p,q)=\frac{p(p+1)}{2}\frac{q(q+1)}{2} \]

\[f(p,q)=\sum_{x=1}^{p}\mu(x)x^2g(p/x,q/x) \]

\[ans=\sum_{d=1}^ndf(n/d,m/d) \]

使用整除分块解决。

4. P3312 [SDOI2014] 数表

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

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

相关文章

CentOS7 - firewalld只允许国内ip访问

firewalld只允许国内ip访问 #查看public区域大致情况 firewall-cmd --zone=public --list-all #获取china ip源 wget --no-check-certificate -O- http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest | awk -F\| /CN\|ipv4/ { printf("%s/%d\n", $4, 32…

2025 寒假集训 第二期

2025 寒假集训 第二期 J - Shift and Flip 题意:给出两个 \(01\) 串 \(A,B\) ,要求使两串相等,可以执行以下三种操作将 \(A\) 左移一个单位 将 \(A\) 右移一个单位 选择一个位置 \(i\) 满足 \(B_i=1\) ,使 \(A_i\) 取反求最小操作数。 思路:不可能的情况只有当 \(B\) 全为…

为word中的图片批量添加边框

写报告时,经常会在word中插入几十张甚至是上百张图片,而为了美观,通常会为这些图片添加边框,但一个个添加显然是疯狂且愚蠢的,我们应该做一些更有效率的事情。 使用python-docx来实现我们的操作(由于各种原因,不会选择用宏) 首先观察一下图片加边框前后的文档结构变化(…

DeepSeek本地化部署超简单!快给你的大模型安排上聊天助手吧!

上一篇我们讲了如何把deepseek R1 安装部署到个人电脑上。(感兴趣的请跳转至 https://www.cnblogs.com/AI2025/p/18709288) 但是,我们部署完了发现,如果仅仅是只在黑漆漆的命令行里面去和AI对话聊天,感觉很不人性化,也不好用。那么,有没有更好的和AI交互聊天的工具呢? …

prometheus监控k8s并发送报警

1.编辑prometheus的configmap文件kubectl edit cm prometheus-1738826520-server2.添加如下红色字体apiVersion: v1 data:alerting_rules.yml: |-groups:- name: deployment Monitoringrules:- alert: DeploymentReplicasUnavailableexpr: kube_deployment_status_replicas_una…

VS2022 安装失败 : 未能安装包“Microsoft.VisualStudio.JavaScript.SDK_1.0.1738743,version=1.0.1738743”

VS2022 安装失败,异常提醒: 1、未能安装包“Microsoft.VisualStudio.JavaScript.SDK_1.0.1738743,version=1.0.1738743” 2、未能安装包“Microsoft.Windows.SDK.BuildTools_10.0.26100.1742,version=1.0.0.0” 问题原因,可以直接查看本地安装异常日志文件,文件中的描述应该…

项目管理证书报考条件:不同证书的对比分析

项目管理领域的证书众多,它们在行业内都具有一定的认可度和价值。对于有意投身项目管理行业或提升自身项目管理能力的人来说,了解不同证书的报考条件至关重要。这不仅关系到能否顺利报考,更影响着未来的职业发展方向。接下来,我们将对几种常见的项目管理证书报考条件进行对…

C# 迷宫求解算法,给出思路和例子。

C# 迷宫求解算法 迷宫求解通常可以使用 深度优先搜索(DFS)、广度优先搜索(BFS)、A(A-star)搜索* 或 Dijkstra 算法。以下是几种常见方法的思路及代码示例。1. 迷宫表示 迷宫通常可以使用 二维数组(char[,] 或 int[,])来表示:0 表示可以通过的路径 1 表示墙或障碍物 S(…

No.18 Kappa系数精度评价2.0

# Loading necessary libraries library(openxlsx) library(vcd)# Reading the Excel data AccData <- read.xlsx("D:/R_proj/a绘图demo/bKappa/五指山生态系统分类精度评价一二级类.xlsx",sheet = 1, colNames = T)# Handle missing values (replace NA with 0) …

什么是回溯法,给个C#简单的例子。

回溯法(Backtracking)是一种搜索算法,主要用于解决组合优化问题,如全排列、子集、数独、八皇后问题等。它通过递归的方式尝试所有可能的解决方案,并在发现当前路径无法得到正确答案时回溯到上一步,继续尝试其他路径。 回溯法的基本思想选择:选择一个可能的选项。 约束:…

如何挑选项目型企业管理系统?10款软件为你解答

本文介绍了以下10款项目型企业管理系统:1.Worktile;2.PingCode;3.Teambition;4.石墨文档;5.蓝鲸智云;6.Trello;7.Asana;8.Monday.com;9.Jira;10.Basecamp。在日益复杂的项目管理环境中,很多企业面临一个共同的挑战:如何高效、精准地管理多个项目、协调各方资源,并…

【新零售】新零售ERP如何对接第三方WMS

一、新零售业务中仓储相关的业务场景 在新零售的业务模式中,由于涉及到的SKU种类巨多,同时门店覆盖的地域广泛,再加上新零售业态有多种多样的玩法(即时零售、全渠道一盘货等),所以会对仓储物流方面提出更多、更高的要求。 1.1 常规备货、发货的场景 新零售公司得从供应商…