筛法求因数和、莫比乌斯函数
更好的观感体验。
好吧,也是不鸽了,上篇文章的续集来了。
筛法求因数和
给定
前置芝士补充
根据唯一分解定理,一个数
一个质数
因为
筛法实现
定义两个数组
分为两种情况。
-
i\mod p_j=0 $$g_i=\sum^{a_j}_{k=0}p_j^k$$ 标记的数 $m=p_j\times i$ 中的指数为 $a_j+1$,则: $$g_m=\sum^{a_j+1}_{k=0}p_j^k$$ $$f_m=\frac{f_i\times g_m}{g_i}$$ -
i\mod p_j\not=0 $$g_m=1+p_j$$ 其中的 $1$ 是 $p_j^0$。 $$f_m=g_m\times f_i$$
还有,如果
\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];
}
}
}
筛法求莫比乌斯函数
给定
前置知识补充
根据唯一分解定理,一个数
筛法实现
-
i\mod p_j=0 -
i\mod p_j\not=0 $$mu_m=-mu_i$$ ## $\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 )
还有,欢迎来到我的博客玩哦!