莫比乌斯函数介绍&&基础
定义
设正整数$N$按照算术基本定理分解质因数为$N=p_1^{c_1}p_2^{c_2} \cdots P_m^{c_m}$,定义函数:
$$\mu(N)= \left\{\begin{matrix}
0 \ \ \ \ \ \ \ \ \ \ \ \ \ \ c_i \geq 1 \\
1 \ \ \ \ \ \ \ m\equiv 0(mod 2)), c_i=1 \\
-1\ \ \ \ \ m\equiv 0(mod 2)), c_i=1
\end{matrix}\right.$$
称$\mu(N)$为Mobius函数(莫比乌斯函数).
通俗地讲,当$N$包含相等的质因子时,$\mu(N)=0$。当$N$的所有质因子各不相同时,若$N$有偶数个质因子,$\mu(N)=1$,若$N$有奇数个,$\mu(N)=-1$.
实现
若只求一项Mobius函数,则分解质因数即可。若求$1 \sim N$的每一项Mobius函数,可以利用$Eratosthenes$筛法。把所有$\mu$初始化为1。接下来,对于筛出的每个质数$p$,令$\mu(p)=-1$,并扫描$p$的倍数 $x=2p, 3p, \cdots,\left \lfloor n/p \right \rfloor * p$,检查$x$能否被$p^2$整除。若能,则令$\mu(x)=0$,否则令$\mu(x) = - \mu(x)$.
1 void getmiu(int n) 2 { 3 for(int i=1;i <= n;i++) miu[i]=1, vis[i]; 4 for(int i=2;i <= n;i++) 5 { 6 if(vis[i]) continue; 7 miu[i] = -1; //i没有被访问,说明i是素数 8 for(int j = 2*i; j <= n;j += i) 9 { 10 vis[j] = 1; 11 if(j % (i*i) == 0) miu[j] = 0; //含有平方因子 12 else miu[j] *= -1; 13 } 14 } 15 }
个性签名:时间会解决一切