前提知识
首先
对于一个大于1正整数n可以分解质因数:
n
=
p
1
d
1
+
p
2
d
2
+
.
.
.
+
p
k
d
k
,
其
中
p
i
为
素
数
n = p_1^{d_1} + p_2^{d_2} + ... + p_k^{d_k},其中p_i为素数
n=p1d1+p2d2+...+pkdk,其中pi为素数
那么根据排列组合,可以知道
约
数
的
个
数
f
a
c
t
o
r
(
n
)
=
(
1
+
d
1
)
(
1
+
d
2
)
.
.
.
(
1
+
d
k
)
约数的个数factor(n) = (1+d_1)(1+d_2)...(1+d_k)
约数的个数factor(n)=(1+d1)(1+d2)...(1+dk)
开始筛选
首先我们引入一个数组 d ( i ) d(i) d(i)表示 i i i的最小质因子的次幂,(最小的原因是素数筛里每次都是用最小的质因子来筛合数的)
当
i
是
素
数
时
,
显
然
有
f
a
c
t
o
r
(
i
)
=
2
,
d
[
i
]
=
1
当i是素数时,显然有factor(i)=2,d[i]=1
当i是素数时,显然有factor(i)=2,d[i]=1
记
p
j
p_j
pj表示一个素数
当i不是素数时,分两种情况;
当
i
%
p
j
≠
0
且
g
c
d
(
i
,
p
j
)
=
1
时
,
由
积
性
函
数
的
性
质
可
得
f
a
c
t
o
r
[
i
∗
p
j
]
=
f
a
c
t
o
r
[
i
]
∗
f
a
c
t
o
r
[
p
j
]
=
f
a
c
t
o
r
[
i
]
∗
2
;
d
[
i
∗
p
j
]
=
1
当i\%p_j\neq0且gcd(i,p_j)=1时,由积性函数的性质可得factor[i * p_j] = factor[i] * factor[p_j] = factor[i] * 2;d[i*p_j]=1
当i%pj=0且gcd(i,pj)=1时,由积性函数的性质可得factor[i∗pj]=factor[i]∗factor[pj]=factor[i]∗2;d[i∗pj]=1
当
i
%
p
j
=
0
时
,
说
明
p
j
是
i
的
最
小
质
因
子
;
因
此
f
a
c
t
o
r
[
i
∗
p
j
]
=
f
a
c
t
o
r
[
i
]
/
(
d
[
i
]
+
1
)
∗
(
(
d
[
i
]
+
1
)
+
1
)
;
d
[
i
∗
p
j
]
=
d
[
i
]
+
1
;
当i\%p_j=0时,说明p_j是i的最小质因子; 因此factor[i * p_j] = factor[i] / (d[i] + 1) * ((d[i] + 1)+1); d[i*p_j]=d[i]+1;
当i%pj=0时,说明pj是i的最小质因子;因此factor[i∗pj]=factor[i]/(d[i]+1)∗((d[i]+1)+1);d[i∗pj]=d[i]+1;
Code
factor[1]=1;
for(int i=2;i<=n;++i){
if(!noprime[i]){
d[i]=1;
factor[i]=2;
prime[++tot] = i;
}
for(int j=1;i*prime[j]<=n&&j<=tot;++j){
noprime[i*prime[j]] = 1;
if(i%prime[j]==0){
factor[i*prime[j]]=factor[i]/(d[i]+1)*(d[i]+2);
d[i*prime[j]] = d[i]+1;
break;
}
factor[i*prime[j]]=factor[i]*2;
d[i*prime[j]]=1;
}
}