题解:

莫比乌斯反演

枚举是哪一个素数

然后就是经典的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); 
}

 

posted on 2018-03-14 17:51  宣毅鸣  阅读(112)  评论(0编辑  收藏  举报