两种方法,第一种方法枚举第一个数i,那么第二个数j一定可以满足x*y%j==0,那么第二个数一定可以通过x * y / i的方法进行枚举出来,因为不分顺序,每次cnt+=2.

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;

int x, y, cnt;

int gcd(int a, int b)
{
	return b ? gcd(b, a % b) : a;
}

int ecd(int a, int b)
{
	return a * b / gcd(a, b);
}

int main()
{
	cin >> x >> y;
	int n = x * y;
	for (int i = x; i*i <= n; i++)
	{
		int j = n / i;
		if (gcd(i, j) == x && ecd(i, j) == y) cnt += 2;
	}
	cout << cnt << endl;
	return 0;
}

第二种方法可以预处理出区间[x,y]中所有i%x==0,y%i==0的数,两个数一定包含在预处理的数中,此时再通过暴力的方法就可以避免超时。

#include<bits/stdc++.h>
#include<vector>
using namespace std;
const int N=1e6+10;

int gcd(int a,int b)
{
	return b ? gcd(b,a%b) : a;
}
int f(int a,int b)
{
	return a*b/gcd(a,b);
}
int main()
{
	vector<int> c;
	int x,y;
	cin>>x>>y;
	int ans=0;
	for(int i=x;i<=y;i++)
	{
		if(i%x==0&&y%i==0) c.push_back(i);
	}
	for(int i=0;i<c.size();i++)
	{
		for(int j=0;j<c.size();j++)
		{
			if(gcd(c[i],c[j])==x&&f(c[i],c[j])==y) ans++;
		}
	}
	cout<<ans;
	return 0;
}