GCD & LCM Given x and y (2 <= x <= 100,000, 2 <= y <= 1,000,000), you are to count the number of p and q such that:
- p and q are positive integers;
- GCD(p, q) = x;
- LCM(p, q) = y.
Input
x and y, one line for each test.
Output
Number of pairs of p and q.
Sample Input
3 60
Sample Output
4
a * b=GCD * LCM => (a/GCD) * (b/GCD) = LCM/GCD 寻找乘积为 LCM/GCD 且互质的两个数 一来从 LCM 到 LCM/GCD缩小了查找范围,二来寻找一对互质数可以作为筛查条件
其实一个思想很重要:把求解的数转化成和质数有关来求解,因为质数相对合数少很多,所以这样处理问题范围减小很多! 验证素数的时候只需验证到该数的开方根,降低复杂度
#include <iostream>
using namespace std;
int gcd(int a,int b){
if(a%b==0)return b;
return gcd(b,a%b);
}
int main(){
int x,y;
while(cin>>x>>y){
int res=0;
if(y%x!=0){
cout<<"0"<<endl;
continue;
}
else{
int m=y/x;
for(int i=1;i<=m;i++){
if(m%i==0){
if(gcd(i,m/i)==1)res++;
}
}
}
cout<<res<<endl;
}
return 0;
}
|