题目大意:
告知两个数x,y.求另外两个数的组合p,q,满足
gcd(p,q)=x;
lcm(p,q)=y;
思路:
因为x是p,q的最大公约数,所以可以假设m=p/x,n=q/x; 可以证明m,n肯定是互质的,利用反证法。
也就是说明 m*n=(p/x)*(q/x)=(p*q)/(x*x);
以因为 lcm=(p*q)/gcd,代入可以 m*n=lcm/gcd; 就是如果y/x的质因子个数所有可能情况,排列计算可以得到结果为 2^k ,k为y/x的质因子个数;
代码如下:
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
vector<int> prime(78500);
int count(int x,int y)
{
if(y%x!=0) return 0;
int z=y/x;
int j=0;
int total=0;
for(int j=0;prime[j]<=z;++j){
if(z%prime[j]==0){
while(z%prime[j]==0) z/=prime[j];
total+=1;
}
}
return 1<<total;
}
int main()
{
int x,y;
prime[0]=2;
int k=1;
for(int i=3,j=0;i<1000000;i+=2,j=0){
bool flag=true;
while(prime[j]<=sqrt(i) && j<k){
if((i%prime[j])==0) {flag=false;break;}
++j;
}
if(flag)prime[k++]=i;
}
while(cin>>x>>y){
cout<<count(x,y)<<endl;
}
}