做这题需要明白一个概念!两个数的积等于它们最大公约数和最小公倍数的积,比如4和6的最大公约数是2,最小公倍数是12,4*6=2*12;所以,我们可以先读入x,y的积,将其设为z,再通过遍历去找能被z整除的一个数,如果这个数的最大公约数仍是x,(由于乘积关系,那么最小公倍数必然是y,则无需再去考虑)便找到了满足要求的一组数了。
代码如下:
#include <bits/stdc++.h>
using namespace std;
int gcd(int a,int b) //找a,b(a>=b)的最大公约数
{
if(a%b==0)
return b;
return gcd(b,a%b);
}
int main()
{
int x,y,cnt=0;
cin>>x>>y;
if(x==y)
cnt--;
//由于后面我们每找一个数就加2,视为两个数交换再成一组的情况,若有重复的话交换了也还是一组,
//所以这里要减去1
int z=x*y;
for(int i=1;i<=sqrt(z);i++)
{
if(z%i==0 && gcd(i,z/i)==x)
cnt+=2;
}
cout<<cnt<<endl;
return 0;
}