GCD and LCM
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
题解:给你三个数x,y,z的最大公约数G和最小公倍数L,问你三个数字一共有几种可能。注意123和321算两种情况。
运用唯一定理。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define maxn 10000005
int t,g,l,prime[maxn];
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&g,&l);
if(l%g)
{
printf("0\n");
continue;
}
int k=l/g;
memset(prime,0,sizeof(prime));
int m=0;
for(int i=2; i<=k; i++)
{
if(k%i==0)
{
while(k%i==0)
{
prime[m]++;
k/=i;
}
m++;
}
}
if(k>1)
prime[m++]++;
int sum=1;
for(int i=0; i<m; i++)
{
if(prime[i])
sum*=(prime[i]*6);
}
printf("%d\n",sum);
}
return 0;
}