(1)f(n)
这题是素数筛的基础上的找规律的题。
规律:
G
c
d
(
n
)
=
{
p
n
=
p
x
1
n
=
p
1
x
1
∗
p
2
x
2
.
.
.
p
k
x
k
Gcd(n)=\begin{cases} p & n = p^{x} \\ 1 & n=p_{1}^{x_{1}}*p_{2}^{x_{2}}...p_{k}^{x_{k}} \end{cases}
Gcd(n)={p1n=pxn=p1x1∗p2x2...pkxk(其中p及其p下标元素都是素数)
简单描述规律的逻辑证明:
我们要明确一点
C
n
k
=
n
∗
(
n
−
1
)
.
.
.
(
n
−
k
+
1
)
1
∗
2...
k
=
n
∗
n
−
1
2
.
.
.
n
−
k
+
1
k
C_n^k=\frac{n*(n-1)...(n-k+1)}{1*2...k}=n*\frac{n-1}{2}...\frac{n-k+1}{k}
Cnk=1∗2...kn∗(n−1)...(n−k+1)=n∗2n−1...kn−k+1
而且
C
n
n
=
1
C_n^n=1
Cnn=1,每一项分母都有分子和它结合成1
而在Gcd(n)中,最后一项为
C
n
n
−
1
C_n^{n-1}
Cnn−1,意味着n是不可能被完全消除到1,理论上只有最小为n的数能将n变成1
1)当
n
=
p
x
n = p^{x}
n=px,时很容易根据上面的分析知道,n始终都会在
C
n
i
C_n^{i}
Cni中以
p
j
的
形
式
存
在
p^{j}的形式存在
pj的形式存在,最多被分解到只有p,那么很显然Gcd(n)=p。
2)当
n
=
p
1
x
1
∗
p
2
x
2
.
.
.
p
k
x
k
n=p_{1}^{x_{1}}*p_{2}^{x_{2}}...p_{k}^{x_{k}}
n=p1x1∗p2x2...pkxk时,按照上面的逻辑必定有i使得
C
n
i
C_n^{i}
Cni没有
p
j
项
p_{j}项
pj项,故任何有关质因数都无法对Gcd做贡献,Gcd的值就为1.
这里使用埃筛,埃筛的利用数因子重复筛数,所以可以。
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn = 1000000+5;
int factor[maxn] = {0},N;
ll ans[maxn];
void e(){
for(int i = 2;i <= 1000000;i++){
if(factor[i]==0){
factor[i] = i;
for(int j = i*2;j <= 1000000;j+=i){
if(factor[j]==0)factor[j] = i;
else factor[j] = 1;
}
}
}
}
void init(){
ans[2] = 0;
for(int i = 3;i <= 1000000;i++)ans[i] =ans[i-1] + factor[i];
}
int main(){
e();
init();
while(cin >> N){
cout << ans[N] <<endl;
}
return 0;
}