对于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 <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstring>
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;
}