题目大意:
告知两个数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; } }