两种方法,第一种方法枚举第一个数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;
}