题目分析
题目难度:普及-
朴素暴力的想法是来一个二重循环,但显然会TLE,所以要寻求最大公约数gcd与最小公倍数lcm之间的关系。
预备知识
设x=gcd(p,q),y=lcm(p,q)
则 x*y = p*q
证明:设 A=p/x,B=q/x,则A与B互质
(A与B互质,即gcd(A,B)=1。如果两者不互质,则说明A与B之间的最大公约数会大于x,与前提矛盾)
然后有 y=A*B*x (想一想,x是p与q的最大公约数,A是p中独有的因数,B是q中独有的因数,故两者的最小
公倍数必然等于 p与q中独有的因数的乘积再乘上两者的最大公约数。)
所以,x*y=p*q
所以对p进行枚举,从1~y之间的所有数,如果x * y可以整除p 且 gcd(p,x*y/q)=x,则这是一组解。
简单的优化是y可以进行缩小到sqrt(x * y),且对p进行枚举的时候可以直接从x开始,然后加法步长是x
AC代码
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b)
{//返回两个数的最大公约数
while(b)
{
int mod = a%b;
a = b;
b = mod;
}
return a;
}
int lcm(int a,int b,int Gcd)
{ //返回两个数的最小公倍数
return a*b/Gcd;
}
int x,y;
int main()
{
cin>>x>>y;
int ans = 0;
if(x>y) // 让x一直小于y
{
int temp = x;
x = y;
y = temp;
}
for(int i=x;i<=y;i+=x)
if(x*y%i==0 && gcd(i,x*y/i)==x)
ans++;
cout<<ans;
}