bzoj2818

对于1~n中满足条件的数对的个数

就是对于每个质数i来说,求[1....n/i]中互质的数的个数

设y>=x,那么我们可以用sum[1]+sum[2]+.....+sum[n/i]维护出num  (sum为欧拉函数的前缀和)

有序的话乘2减1(因为(1,1)无序)

/**************************************************************

    Problem: 2818

    User: syh0313

    Language: C++

    Result: Accepted

    Time:1772 ms

    Memory:245428 kb

****************************************************************/

 

#include

#include

#include

#include

#include

#include

using namespace std;

const int maxn=1e7+10;

int n,cnt;

long long primes[maxn],ph[maxn],sum[maxn],ans;

bool v[maxn];

int main()

{

    scanf("%d",&n);

    memset(v,1,sizeof v); v[1]=0; ph[1]=1;

    for (int i=2;i<=n;i++)

    {

        if (v[i]) primes[++cnt]=i,ph[i]=i-1;

        for (int j=1;j<=cnt && i*primes[j]<=n;j++)

        {

            v[i*primes[j]]=0;

            if (i%primes[j]==0) {ph[i*primes[j]]=ph[i]*primes[j]; break;}

             else ph[i*primes[j]]=ph[i]*ph[primes[j]];

        }

    }

    for (int i=1;i<=n;i++) sum[i]=sum[i-1]+ph[i];

    for (int i=1;i<=n;i++)

     if (v[i]) ans=ans+2ll*sum[n/i]-1;

    printf("%lld\n",ans);

return 0;

}

你可能感兴趣的:(bzoj2818)