筛法求因数和、莫比乌斯函数
好吧,也是不鸽了,上篇文章的续集来了。
筛法求因数和
给定 ,求 ~ 的因数和。
前置芝士补充
根据唯一分解定理,一个数 为:
一个质数 的因数有 ,共有 个因数,质数 的因数和为:
因为 有多个这个因数,所以 的因数和为:
筛法实现
定义两个数组 ,分别记录最小质因子不同次幂的和和约束和。
分为两种情况。
-
是 的最小质因子,设 中 的指数为 ,则:标记的数 中的指数为 ,则:
-
不包含质因子 :其中的 是 。
还有,如果 为质数,则:
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];
}
}
}
筛法求莫比乌斯函数
给定 ,求 ~
前置知识补充
根据唯一分解定理,一个数 为:
如果 ,。
如果 含有相同质因子,。
否则 , 为 的不同质因子个数。
筛法实现
为质数则 。
定义数组 ,,定义
包含质因子 ,则 (因为第 条规则)。
比 多一个质因子 ,则:
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];
}
}
}
总结
这次我们学习了筛法求因数和、莫比乌斯函数。
筛法可以求:
- 质数
- 欧拉函数()
- 因数个数
- 因数和
- 莫比乌斯函数()
筛法求因数和、莫比乌斯函数
https://maqiyue114514.github.io/2025/07/01/筛法求因数和、莫比乌斯函数/