题目:https://www.acwing.com/problem/content/222/
题意:求1-n范围内,gcd(x,y)是素数的对数
思路:首先我们可以针对每个素数p,那么他的贡献应该时 [1,n/p] 互质的对数,这个其实就是遍历这个范围累加每个数的欧拉值,这里我们就可以用个前缀和,然后计算即可
#include<bits/stdc++.h> #define maxn 10000005 #define len 100005 #define mod 1000000007 using namespace std; typedef long long ll; ll mark[maxn]; ll phi[maxn]; ll pri[maxn]; ll sum[maxn]; int tot; ll n; void getphi()//欧拉表 { phi[1]=1; for(int i=2;i<=n;i++) { if(!mark[i]){phi[i]=i-1;pri[++tot]=i;} for(int j=1;j<=tot;j++) { int x=pri[j]; if(i*x>n)break; mark[i*x]=1; if(i%x==0){phi[i*x]=phi[i]*x;break;} else phi[i*x]=phi[i]*phi[x]; } } } int main(){ scanf("%lld",&n); getphi(); sum[0]=phi[0]; for(int i=1;i<=n;i++) sum[i]=sum[i-1]+phi[i]; ll num=0; for(int i=1;i<=tot;i++){ num+=2*sum[n/pri[i]]-1; } printf("%lld",num); }