模板
莫比乌斯反演公式
莫比乌斯反演是一种通过公式简化运算的方法
如果需要求解的是\(f(n)\),可以找到另一个符合条件的函数\(F(n)\),通过反演公式计算出\(f(n)\)
莫比乌斯反演公式:
\[F(n)=\sum_{d|n}f(d)\Rightarrow f(n)=\sum_{d|n}\mu (d)F(\frac{n}{d})
\]
\[F(d)=\sum_{d|n}f(n)\Rightarrow f(d)=\sum_{d|n}\mu (\frac{n}{d})F(n)
\]
莫比乌斯函数
莫比乌斯反演中的\(\mu(n)\)称为莫比乌斯函数
莫比乌斯函数的计算方法为:
1.若\(n\)可以被除1以外的完全平方数整除,\(\mu(n)=0\)
2.否则设\(n\)的质因数的个数为\(k\),\(\mu(n)=(-1)^k\)
由于整数分解可以在\(O(\sqrt n)\)的时间复杂度内完成,所以可以在\(O(\sqrt n)\)的时间复杂度内得到\(\mu (n)\)的值
也可以使用线性筛在\(O(n)\)的时间复杂度内得到\([1,n]\)中所有数的\(\mu\)值
模板一:质因数分解求单个数的\(\mu\)值
int get_mu(int n){
int mu=1;
for(int i=2;i*i<=n;i++){
if(n%i==0){
mu*=-1;
n/=i;
if(n%i==0) return 0;
}
}
if(n>1) mu*=-1;
return mu;
}
模板二:线性筛求[1,n]中所有数的\(\mu\)值
const int maxn=100010;
int is_prime[maxn],prime[maxn],cnt,mu[maxn];
void moebius(int n){
mu[1]=1;
for(int i=2;i<=n;i++){
if(!is_prime[i]){
prime[cnt++]=i;
mu[i]=-1;
}
for(int j=0;j<cnt && i*prime[j]<=n;j++){
is_prime[i*prime[j]]=1;
if(i%prime[j]==0){
mu[i*prime[j]]=0;
break;
}
mu[i*prime[j]]=-mu[i];
}
}
}