筛法求因数和、莫比乌斯函数

更洛谷的观感体验

好吧,也是不鸽了,上篇文章的续集来了。

筛法求因数和

给定 nn,求 11 ~ nn 的因数和。

前置芝士补充

根据唯一分解定理,一个数 nn 为:

n=i=1spiain=\prod_{i=1}^s p_i^{a_i}

一个质数 piaip_i^{a_i} 的因数有 pi0,pi1,pi2,,piaip_i^0,p_i^1,p_i^2,…,p_i{a_i},共有 ai+1a_i+1 个因数,质数 piaip_i^{a_i} 的因数和为:

f(piai)=j=0aipijf(p_i^{a_i})=\sum^{a_i}_{j=0}p_i^j

因为 nn 有多个这个因数,所以 nn 的因数和为:

f(n)=i=1sj=0aipijf(n)=\prod^s_{i=1}\sum^{a_i}_{j = 0}p_i^j

筛法实现

定义两个数组 g,fg,f,分别记录最小质因子不同次幂的和和约束和。

分为两种情况。

  1. imodpj=0i\mod p_j=0
    pjp_jii 的最小质因子,设 iipjp_j 的指数为 aja_j,则:

    gi=k=0ajpjkg_i=\sum^{a_j}_{k=0}p_j^k

    标记的数 m=pj×im=p_j\times i 中的指数为 aj+1a_j+1,则:

    gm=k=0aj+1pjkg_m=\sum^{a_j+1}_{k=0}p_j^k

    fm=fi×gmgif_m=\frac{f_i\times g_m}{g_i}

  2. imodpj0i\mod p_j\not=0
    ii 不包含质因子 pjp_j

    gm=1+pjg_m=1+p_j

    其中的 11pj0p_j^0

    fm=gm×fif_m=g_m\times f_i

还有,如果 ii 为质数,则:

gi=fi=1+ig_i=f_i=1+i

Code\texttt{Code}

int p[N], cnt, g[N], f[N];
void get_f(int n)
{
	g[1] = f[1] = 1;
	for(int i = 2; i <= n; i++)
	{
		if(!vis[i])
			p[++cnt] = i, g[i] = f[i] = i + 1;
		for(int j = 1; j <= n; j++)
		{
			int m = p[j] * i;
			vis[m] = true;
			if(i % p[j] == 0)
			{
				g[m] = g[i] * p[j] + 1;
				f[m] = f[i] / g[i] * g[m];
				break;
			}
			g[m] = p[j] + 1;
			f[m] = f[i] * g[m];
		}
	}
}

筛法求莫比乌斯函数

给定 nn,求 μ(1)\mu(1) ~ μ(n)\mu(n)

前置知识补充

根据唯一分解定理,一个数 nn 为:

n=i=1spiain=\prod_{i=1}^s p_i^{a_i}

如果 n=1n = 1μ(n)=1\mu(n)=1
如果 nn 含有相同质因子,μ(n)=0\mu(n)=0
否则 μ(n)=(1)s\mu(n)=(-1)^sssnn 的不同质因子个数。

筛法实现

pp 为质数则 μ(p)=1\mu(p)=-1
定义数组 mumumui=μ(i)mu_i=\mu(i),定义 m=i×pjm=i\times p_j

  1. imodpj=0i\mod p_j=0
    ii 包含质因子 pjp_j,则 mum=0mu_m=0(因为第 22 条规则)。
  2. imodpj0i\mod p_j\not=0
    mmii 多一个质因子 pjp_j,则:

    mum=muimu_m=-mu_i

Code\texttt{Code}

int p[N], cnt, mu[N];
bool vis[N];
void get_mu(int n)
{
	mu[1] = true;
	for(int i = 2; i <= n; i++)
	{
		if(!vis[i])
			p[++cnt] = i, mu[i] = -1;
		for(int j = 1; p[j] * i <= n; j++)  
		{
			int m = p[j] * i;
			vis[m] = true;
			if(i % p[j] == 0)
			{
				mu[m] = 0;
				break;
			}
			else
				mu[m] = -mu[i];
		}
	}
}

总结

这次我们学习了筛法求因数和、莫比乌斯函数。

筛法可以求:

  • 质数
  • 欧拉函数(φ\varphi
  • 因数个数
  • 因数和
  • 莫比乌斯函数(μ\mu

筛法求因数和、莫比乌斯函数
https://maqiyue114514.github.io/2025/07/01/筛法求因数和、莫比乌斯函数/
作者
maqiyue
发布于
2025年7月1日
更新于
2025年7月1日
许可协议