前置知识:
积性函数:
对于互质整数(a) ,(b),如果有(f(a imes b)=f(a) imes f(b)) ,那么称(f(x))为积性函数,例如 (varphi,mu,sigma,d)
而完全积性函数是对于任意的整数(a) , (b),有(f(a imes b)=f(a) imes f(b))的数论函数如 (epsilon,I ,id)
Mobius 函数( μ ):
(mu(n) = egin{cases} 1, & n = 1 \ (-1)^m, &n = prod_{i=1}^{n} space p_i \ 0, &otherwise end{cases})
可以看出,$ μ(n) $ 恰在 (n) 无平方因子时取值非零。
可以线性筛
inline void prework(){
miu[1]=1;
for(int i=2;i<N;++i){
if(!vis[i]) pri[cnt++]=i,miu[i]=-1;
for(int j=0;j<cnt&&i*pri[j]<N;++j){}
vis[i*pri[j]]=1; if(i%pri[j]) miu[i*pri[j]]=-miu[i];
else{miu[i*pri[j]]=0; break;}
} miu[i]+=miu[i-1];
} return ;
}
Dirichlet 卷积
同时 (epsilon) 函数是 (Dirichlet) 卷积的单位元,即 (f = f ast epsilon)
常见的卷积式子有: (mu * I=epsilon,varphi * I= id,mu * id = varphi)
Mobius 反演
设 (f) 是数论函数,定义函数 (g) 满足
则称 (g) 是 (f) 的 (Mobius) 变换。
(f(x))也可以被表示为:
证明需要用到前面的性质
其实就是个容斥,看看每个因子被加了几遍,然后加加减减就好了
反演的公式用 (Dirichlet) 卷积表示即为 (g = f ast 1)
推一下式子。
即 (color{red} {g = f ast 1 Leftrightarrow f = g ast mu})
推式子一般使用如下方式
1.枚举 (gcd),除掉 (d)
2.([gcd(i,j)=1] ightarrow sumlimits _ {d|i,d|j} mu(d))
3.(T=dp) 然后提出来 (T)
例题
-
双亲数
提出来 (gcd) 直接整除分块
for(reg int l=1,r;l<=n;l=r+1){ r=n/(n/l); ... }
-
YY的GCD
这个题的式子稍显复杂,使用第三个套路能得到朴素的整除分块式
-
约数个数和
首先用 (d(ij)=sum_{x|i}sum_{y|j} [gcd(x,y)=1]) 让式子只有函数 (mu)
剩下需要预处理 (s(x)=sum_{i=1}^xlfloorfrac xi floor) 再前缀和一次