Problem Description
Given two positive integers G and L, could you tell me how many solutions of (x, y, z) there are, satisfying that gcd(x, y, z) = G and lcm(x, y, z) = L?
Note, gcd(x, y, z) means the greatest common divisor of x, y and z, while lcm(x, y, z) means the least common multiple of x, y and z.
Note 2, (1, 2, 3) and (1, 3, 2) are two different solutions.
Input
First line comes an integer T (T <= 12), telling the number of test cases.
The next T lines, each contains two positive 32-bit signed integers, G and L.
It’s guaranteed that each answer will fit in a 32-bit signed integer.
Output
For each test case, print one line with the number of solutions satisfying the conditions above.
Sample Input
2
6 72
7 33
Sample Output
72
0
代码及注释如下:
/*
此题的G和L范围在int范围内,所以求其中的最大素因子不超过100000;
所以第一步需要求出1-10万中的素数,然后储存到vector数组中...
第二步就是求个数了..
如果LCM不能除尽GCD的话,说明不能组成,直接输出0.
如果能够除尽,L需要先除以G,将两个数的公共素因子幂全部消去...
最后是素因子分解L.
每分解一个素因子就用6*素因子的指数....
答案就是素因子的指数乘6累成起来的...
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
const int maxn=100000;
vector<int>pri;
int isnot[maxn+5];
int t;
int x,y;
int Size;
void Judge ()
{
memset (isnot,0,sizeof(isnot));
isnot[1]=1;
for (int i=2;i<=maxn;i++)
{
if(!isnot[i])
{
pri.push_back(i);
for (int j=2*i;j<=maxn;j+=i)
isnot[j]=1;
}
}
Size=pri.size();
}
int main()
{
Judge();
scanf("%d",&t);
while (t--)
{
int num=1;
scanf("%d%d",&x,&y);
if(y%x)
printf("0\n");
else
{
y/=x;
for (int i=0;i<Size;i++)
{
int cnt=0;
if(pri[i]*pri[i]>y)
break;
while(y%pri[i]==0)
{
cnt++;
y/=pri[i];
}
if(cnt)
num*=6*cnt;
}
if(y!=1)
num*=6;
printf("%d\n",num);
}
}
return 0;
}