莫比乌斯反演(以及前置知识:整除分块,线性筛,狄利克雷卷积)

前置知识:

一.整除分块

冷知识:

1.\(\lfloor\frac{a}{bc}\rfloor = \lfloor\frac{\lfloor\frac{a}{b}\rfloor}{c}\rfloor\)

正文:

若暴力求解\(\sum^{n}_{i=1}\lfloor\frac{n}{i}\rfloor\),时间复杂度为O(n),但如果使用整除分块则可以令时间复杂度缩小至\(O(\sqrt{n})\)
具体做法:可以令\(l=1\),则通过\(l\)可以算出右端点(\(r=\lfloor\frac{n}{\lfloor\frac{n}{l}\rfloor}\rfloor\))。当\(i\)\(l\)\(r\)之间时\(\lfloor\frac{n}{i}\rfloor\)的值相等,所以可以一块一块算。
因为本质不同的\(\lfloor\frac{n}{i}\rfloor\)只有\(\sqrt{n}\)个,所以时间复杂度为\(O(\sqrt{n})\)

二.线性筛

冷知识:

1.若\(f(T)\)为积性函数,且设\(T=\prod^{t}_{i=1}p_{i}^{x_{i}}\),则有\(f(T)=\prod^{t}_{i=1}f(p_{i}^{x_{i}})\)

正文:

线性筛记录两个数组,一个记录一个数是否为合数(bool not_prime[]; ),另一个记录质数(vector primes; )。不会解释,直接看代码吧。(积性函数线性筛一般使用定义或冷知识1进行推导后线性筛)
莫比乌斯函数+质数线性筛代码(代码内手写了vector):

mu[1]=1;
for(int i=2;i<=50000;i++){
	if(!Not_Prime[i]){
		mu[i]=-1;
		pcnt++;
		Primes[pcnt]=i;
	}
	for(int j=1;j<=pcnt;j++){
		if(i*Primes[j]>50000){
			break;
		}
		Not_Prime[i*Primes[j]]=true;
		if(i%Primes[j]!=0){
			mu[i*Primes[j]]=mu[i]*(-1);
		}else{
			mu[i*Primes[j]]=0;
			break;
		}
	}
}

三.狄利克雷卷积

1.定义

对于两个数论函数\(f(x)\)\(g(x)\),则他们的狄利克雷卷积得到的结果\(h(x)\)定义为:
\(h(T)=\sum_{d|T}f(d)g(\frac{T}{d})\)
记作\(h = f * g\)

重要性质:当\(f(x)\)\(g(x)\)均为积性函数时,\(h(x)\)也为积性函数

2.常见的狄利克雷卷积

\(\varepsilon = \mu * 1 (莫比乌斯反演重要结论)\)
\(\varphi = \mu * id\)

四.莫比乌斯反演

posted on 2025-02-11 10:31  jisuheng123  阅读(19)  评论(0)    收藏  举报