您的位置:首页 > 其它

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

2016-10-24 16:26 417 查看


传送门


题解:数论。

我们要求(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<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define N 10000003
#define LL long long
using namespace std;
LL p
,prime
,phi
;
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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: