P2568 GCD
【题意】
求满足$1\leq x,y \leq n$,$gcd(x,y)$是质数的数对$(x,y)$数对数
【分析】
首先这个质数d
$ans=\sum_{d}^{n}[d是质数]\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{n}{d}}[gcd(i,j)==1]$
所以就可以计算出phi,算出前缀和即可计算
【算法】
#include<bits/stdc++.h> using namespace std; #define mp make_pair #define fi first #define se second #define lson now<<1 #define rson now<<1|1 typedef long long ll; const int maxn=1e7+5; int n; int phi[maxn],p[maxn],np[maxn],cnt; ll sum[maxn]; void init() { phi[1]=1; for(int i=2;i<=n;i++) { if(!np[i]) { p[++cnt]=i; phi[i]=i-1; } for(int j=1;p[j]*i<=n;j++) { np[i*p[j]]=1; if(i%p[j]==0) { phi[i*p[j]]=phi[i]*p[j]; break; } phi[i*p[j]]=phi[i]*(p[j]-1); } } for(int i=1;i<=n;i++) sum[i]=sum[i-1]+phi[i]; } int main() { freopen("a.in","r",stdin); freopen("a.out","w",stdout); scanf("%d",&n); init(); ll ans=0; for(int i=1;i<=cnt && p[i]<=n;i++) ans+=sum[n/p[i]]*2-1; printf("%lld",ans); return 0; }