线性筛约数个数和(证明)
Posted Harris-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性筛约数个数和(证明)相关的知识,希望对你有一定的参考价值。
线性筛约数个数和(证明)
之前已经证明过了线性筛约数和,现在证这个就灰常简单了。
非常类似,也是用一个数组来维护 d ( i ) d(i) d(i)。
由算术基本定理:
n = p 1 k 1 p 2 k 2 … p m k m n=p_1^{k_1}p_2^{k_2}\\dots p_{m}^{k_m} n=p1k1p2k2…pmkm
d ( n ) = ( k 1 + 1 ) ( k 2 + 1 ) … ( k m + 1 ) d(n)=(k_1+1)(k_2+1)\\dots(k_m+1) d(n)=(k1+1)(k2+1)…(km+1)
这里 g ( n ) = k 1 + 1 g(n)=k_1+1 g(n)=k1+1,即 n n n的最小素因子个数 + 1 +1 +1。
时间复杂度: O ( n ) O(n) O(n)
ll f[N],g[N];
int cnt,vis[N],p[N];
void init(int n){
vis[0]=vis[1]=1,f[1]=1;
for(int i=2;i<=n;i++){
if(!vis[i]) p[++cnt]=i,f[i]=g[i]=2;
for(int j=1;j<=cnt&&i*p[j]<=n;j++){
vis[i*p[j]]=1;
if(i%p[j]==0){
g[i*p[j]]=g[i]+1;
f[i*p[j]]=f[i]/g[i]*g[i*p[j]];
break;
}
g[i*p[j]]=2;
f[i*p[j]]=f[i]*f[p[j]];
}
}
}
线筛适用于范围较小,但询问较多的题。
以上是关于线性筛约数个数和(证明)的主要内容,如果未能解决你的问题,请参考以下文章
bzoj千题计划204:bzoj1968: [Ahoi2005]COMMON 约数研究(线性筛约数个数)