题解:
莫比乌斯反演
枚举是哪一个素数
然后就是经典的gcdx,y)==p的方案数
最后不要忘记用分块来加速
代码:
#include<cstdio> #include<cmath> #include<algorithm> #include<cstring> using namespace std; typedef long long ll; const int N=1e7+5; ll ans1,ans2; int sum[N],a,b,n,x,y,z,tot,T,cnt,miu[N],flag[N],p[N]; void init() { miu[1]=1; sum[1]=1; for (int i=2;i<N;i++) { if (!flag[i]) { miu[i]=-1; p[++tot]=i; } for (int j=1;j<=tot;j++) { int k=p[j]*i; if (k>=N)break; flag[k]=1; if (i%p[j]==0) { miu[k]=0; break; } miu[k]-=miu[i]; } } for (int i=1;i<N;i++)sum[i]=sum[i-1]+miu[i]; } ll find(int x,int y) { if (x>y)swap(x,y); ll ans=0;int j; for (int i=1;i<=x;i=j+1) { j=min(x/(x/i),y/(y/i)); ans+=(ll)(sum[j]-sum[i-1])*(x/i)*(y/i); } return ans; } int main() { scanf("%d",&n); init(); ll ans=0; for (int i=2;i<=n;i++) if (!flag[i])ans+=find(n/i,n/i); printf("%lld",ans); }