题目大意:

告知两个数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;
    }
}