我们要求(a+b)|ab 的个数。首先考虑枚举gcd(a,b)=d ,则必须满足(a'+b')d|a'*b'*d^2 ,那么(a'+b')|a'*b'*d,因为(a'+b')与a'b'互质,所以(a'+b')|d.
那么在保证gcd(a,b)==1的情况下,(a+b)为什么与ab互质呢?
反证法: 假设(a+b)与ab 不互质,那么gcd((a+b),ab)==m (m!=1)
则有m|ab,(m|a)||(m|b)
假设m|a,又因为 m|(a+b) ,所以m|b.也就是(a,b)必然存在一个质因子p.
与gcd(a,p)=1矛盾,所以 gcd(a,b)==1,gcd(a+b,ab)==1
又因为(a'+b')*d<=n,(a'+b')|d ,所以d=k1(a'+b') (k1>=1) ,所以 (a'+b')<=sqrt(n)
不妨枚举(a'+b')==k k*k*k1<=n k1<=n/(k^2) 则合法的d有n/(k^2)个,再考虑(a'+b')==k的(a',b')的个数,应该有phi(k)个。
为什么呢? 我们要求gcd(a',b')==1时(a',b')的个数。这时有一个结论gcd(a+b,b)==1,那么gcd(a,b)==1.
因为phi(k)正好就是gcd(a'+b',b)==1的个数,所以我们只需要证明上述的结论即可。
还是利用反证法。
当gcd(a+b,b)=1时,假设gcd(a,b)=m (m!=1)
那么a=pm ,b=qm (a+b)=(q+p)m 那么如果这样成立的话gcd(a+b,b)=m,与gcd(a+b,b)==1矛盾,所以得证。
#include
#include
#include
#include
#include
#define N 10000003
#define LL long long
using namespace std;
LL p[N],prime[N],phi[N];
LL ans,n;
int main()
{
scanf("%I64d",&n);
LL m=sqrt(n);
prime[1]=1;
for (LL i=2;i<=m;i++)
{
if (!p[i])
prime[++prime[0]]=i,phi[i]=i-1;
for (LL j=1;j<=prime[0];j++){
if (prime[j]*i>m) break;
p[i*prime[j]]=1;
if (i%prime[j]==0) phi[i*prime[j]]=phi[i]*prime[j];
else phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
ans+=(n/i/i)*phi[i];
}
printf("%I64d\n",ans);
}