算法分析:先求出x的所有倍数和这个数是x的多少倍,这样最大公约数的问题解决,再去找能构成符合题意的最小公倍数的数,看是否是最大公约数
注意:洛谷上提交需优化,数组范围要够,不能出现多余的循环,比如先判断是否能构成最小公倍数,再去看是否有更大的约数,如果公倍数超过最小公倍数,则退出循坏
#include<cstdio>
#include<cstring>
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
long x,y,x1[60000],p=1,x2[60000],s=0;
int main(){
int flag;
cin>>x>>y;
if(x==y) {
cout<<1;
return 0;
}
for(int i=x;i<=y;i=i+x){
x1[p]=i;
x2[p]=i/x;
p++;
}
for(long i=1;i<=p/2;i++){
for(long j=i+1;j<=p;j++){
flag=1;
if(x*x2[i]*x2[j]==y){
flag=0;
for(long v=2;v<=min(x2[i],x2[j]);v++){
if(x2[i]%v==0&&x2[j]%v==0){
flag=1;
break;
}
}
}
if(x*x2[i]*x2[j]>y){
break;
}
if(flag==0){
s=s+1*2;
break;
}
}
}
cout<<s;
}