题解 P2568 【GCD】
Description
题目链接:Luogu 2568
给定整数
数据范围:
Solution
本题和「Luogu 2257」YY 的 GCD(题解) 几乎完全一样,但是本题由于是单组询问,所以不需要
O(n) 的预处理和O(\sqrt n) 的单次询问复杂度。
首先我们枚举质数:
对
接下来改变
此已经可以发现最后一个
所以我们可以线性筛求出
时间复杂度:
Code
#include <cstdio>
const int N=1e7+5,M=1e6+5;
int n,tot,p[M],phi[N];
long long sum[N];
bool flg[N];
void sieve(int n) {
phi[1]=1;
for(int i=2;i<=n;++i) {
if(!flg[i]) p[++tot]=i,phi[i]=i-1;
for(int j=1;j<=tot&&i*p[j]<=n;++j) {
flg[i*p[j]]=1;
if(i%p[j]==0) {
phi[i*p[j]]=phi[i]*p[j];
break;
} else {
phi[i*p[j]]=phi[i]*phi[p[j]];
}
}
}
for(int i=1;i<=n;++i) sum[i]=sum[i-1]+phi[i];
}
int main() {
scanf("%d",&n);
sieve(n);
long long ans=0;
for(int i=1;i<=tot;++i) ans+=2*sum[n/p[i]]-1;
printf("%lld\n",ans);
return 0;
}