【模板】莫比乌斯反演

一、莫比乌斯反演

我们先来看一个函数:F(x)=dxf(d)
我们先枚举一下这个函数的各个值

F(1)=f(1)

F(2)=f(1)+f(2)

F(3)=f(1)+f(3)

F(4)=f(1)+f(2)+f(4)

F(5)=f(1)+f(5)

F(6)=f(1)+f(2)+f(3)+f(6)

F(7)=f(1)+f(7)

F(8)=f(1)+f(2)+f(4)+f(8)

于是,我们可以反过来推导出关于f(n)的关系式

f(1)=F(1)

f(2)=F(2)F(1)

f(3)=F(3)F(1)

f(4)=F(4)F(2)F(1)

f(5)=F(5)F(1)

f(6)=F(6)F(3)F(2)+F(1)

f(7)=F(7)F(1)

f(8)=F(8)F(4)

我们可以得到F(x)=dxf(d)f(x)=dxμ(d)F(nd)

其中,我们可以了解到一个新的函数:莫比乌斯函数

二、莫比乌斯函数:μ(x)

这是莫比乌斯函数,定义如下
  1. x=1,则 μ(x)=1

  2. x=p1p2p3pk,且pi为互不相同的质数,则有μ(x)=(1)k

  3. 其他情况中 μ(x)=0


莫比乌斯函数中有用的性质还是挺多的,这里就只列出一个最常用的炒鸡重要的性质

dnμ(d)=[n=1]

这条性质可以运用到很多与gcd有关的题目中的推导式子中,非常重要

同时,莫比乌斯函数还是一个积性函数
在这里给大家提及一下积性函数f:既当gcd(i,j)=1时,f(xy)=f(x)f(y)的函数叫积性函数
积性函数的性质
  1. f(1)=1
  2. 积性函数的前缀和也是积性函数

莫比乌斯函数就是借助了它是积性函数的特点,使其可以通过线性筛得到

求莫比乌斯函数μ的代码
inline void init()
{
	mu[1]=1;
	for(int i=2;i<N;i++)
	{
		if(!vis[i])
		{
			prime[++cnt]=i;
			mu[i]=-1;
		}
		for(int j=1;j<=cnt&&i*prime[j]<N;j++)
		{
			vis[i*prime[j]]=1;
			if(i%prime[j]==0)break;
			mu[i*prime[j]]=-mu[i];
		}
	}
}

莫比乌斯反演和函数可以运用在很多题目的公式推导上,重点还是公式的推导


三、整除分块

整除分块是在莫比乌斯反演题中重要的一环,将询问的复杂度的从O(n)优化成O(n),可以成功解决大多数数据较大的题目,十分重要
整除分块用于求i=1nni的普遍情况(并不强制如上形式)下,只要满足有规律的一段区间中的值是相同的,就可以用整除分块。我们来看看对于较简单的整除分块。

若令n=22,x=ni,则有:

i=1时,x=22

i=2时,x=11

i=3时,x=7

i=4时,x=5

i=5时,x=4

i=6时,x=3

i=7时,x=3

i=8时,x=2

i=9时,x=2

i=10时,x=2

i=11时,x=2

i=12时,x=1

i=13时,x=1

i=22时,x=1

由上可以看到,由几段区间的x是相同的,我们可以通过l=r+1r=n/(n/l)得到区间[l,r],可以O(1)时间算出这段区间的x的和,最后起到求和的作用
void solve()
{
	int ans=0;
	for(int l=1,r;l<=n;l=r+1)
	{
		r=n/(n/l);
		ans+=(r-l+1)*(n/(n/l));
	}
}
posted @   ShuraEye  阅读(653)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示