莫比乌斯反演(以及前置知识:整除分块,线性筛,狄利克雷卷积)
前置知识:
一.整除分块
冷知识:
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
莫比乌斯函数+质数线性筛代码(代码内手写了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\)
浙公网安备 33010602011771号