//这道题开始想着的是去枚举那两个数,是一个n^2的算法
//但正解其实很tm容易,就是我们要根据那个gcd和lcm,用o(n)解决这个问题
//主要是要利用两数之积=lcm*gcd
/*#include<cstdio>
#include<cstdlib>
using namespace std;
inline int gcd(int x,int y){return y?gcd(y,x%y):x;}
inline int lcm(int x,int y){return x*y/gcd(x,y);}
int main()
{
int x0,y0,ans=0;
scanf("%d %d",&x0,&y0);
for(int i=x0;i<y0;i++)
for(int j=i+1;j<=y0;j++)
if(gcd(i,j)==x0&&lcm(i,j)==y0) ans++;
printf("%d\n",ans<<1);
return 0;
}*/
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<cstring>
#include<iostream>
using namespace std;
inline long long gcd(long long x,long long y) {return y?gcd(y,x%y):x;}
int main()
{
long long x0,y0,ans=0;
scanf("%lld%lld",&x0,&y0);
for(long long i=x0;i<=y0;i++)
{
long long q=x0*y0/i;
long long xzz=gcd(q,i);
if(q*i==x0*y0&&xzz==x0) ans++;
}
printf("%lld\n",ans);
} 大家多多支持cjoj哦
http://oj.changjun.com.cn
快速求解GCD与LCM问题
本文介绍了一个高效算法来求解给定区间内满足特定最大公约数(GCD)与最小公倍数(LCM)条件的数对数量。通过巧妙地利用两数之积等于LCM与GCD乘积的关系,将复杂度从O(N^2)降低到O(N),并提供了完整的C++实现代码。
320





