test 8 Problem A: [noip2016十连测第八场]神炎皇 (数论+gcd两个性质的证明)

传送门

题解:数论。

我们要求(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);
}



你可能感兴趣的:(数论)