线性筛
for(int i=2;i<=n;++i) {
if(!vis[i]) pri[++cnt]=i;
for(int j=1;j<=cnt&&i*pri[j]<=n;++j) {
vis[i*pri[j]]=1;
if(i%pri[j]==0) break;
}
}
只会被最小的素数筛掉。
n
=
p
1
k
1
∗
p
2
k
2
…
…
p
x
k
x
n=p_1^{k_1}*p_2^{k_2}……p_x^{k_x}
n=p1k1∗p2k2……pxkx
枚举的
i
i
i为
x
p
1
\frac{x}{p_1}
p1x,x就是被筛掉的值。
因为找到的素数都是从小到大的,所以从小到大枚举就好了。
当
i
%
p
r
i
[
j
]
=
=
0
i\%pri[j]==0
i%pri[j]==0 就是说枚举到了
i
i
i的最小质因子。这之后的素数因为都比他大,所以都不合格,就break了。
之前的
p
r
i
[
j
]
pri[j]
pri[j]都会比这个pri[j]小都是可以的,每个pri[j]都是i*pri[j]的最小质因子。
可以很方便的求积性函数,只需要毒瘤的简单的分类讨论就好了。
对于下方的东西,请移步cnblogs