[2001年NOIP普及组] 最大公约数和最小公倍数问题
p*q等于x0*y0。可以枚举到x0*y0中能被x0*y0整除的数,如果这个数与另一个这个数与它的积是x0*y0的数的最大公因数是x0或最小公倍数是y0,那这个数不是p就是q。每枚举出这样一个数,随之可以再确定一个数,所以只需要枚举到sqrt(x0*y0)。
#include<iostream> #include<cmath> long long gcd(long long x,long long y) { if(x%y==0) return y; else return gcd(y,x%y); } int main() { int x,y; std::cin>>x>>y; long long xy=x*y; long long qrxy=std::sqrt(xy); int cnt=0; for(long long i=2;i<=qrxy;i++) { if(xy%i==0&&gcd(i,xy/i)==x) { cnt+=2; } } std::cout<<cnt; }