问题:
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,则gcd(最小公约数)一定是这三个数的因子,也一定是lcm(最小公倍数)的因子。所以不难想到令X,Y,Z分别除去gcd,得到X1,Y1,Z1只需求这三个数的组合数即可,用唯一分解定理,分解lcm/gcd的质因子的个数。然后排列一下就行了。
共三种情况:①一个数的p的指数为cnt,一个数的p的指数为0,另一个数的p的指数取1~cnt-1,方 案数为:C(3,1)*C(2,1)*(cnt-1)。
②两个数的p的指数为cnt,一个数的p的指数为0,方案数为:C(3,1)
③一个数的p的指数为cnt,两个个数的p的指数为0,方案数为:C(3,1)则一个指数为 cnt的素数p能产生的方案数为:6*cnt。
代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int sum[1000010]; int main() { int t; scanf("%d",&t); while(t--) { memset(sum,0,sizeof(sum)); int a,b; scanf("%d%d",&a,&b); if(b%a!=0) { printf("0\n"); continue; } else { int h=b/a,t=0; for(int i=2; i*i<=b/a; i++) { if(h%i==0) { while(h%i==0) { h=h/i; sum[t]+=1; } t=t+1; } if(h==1) break; } if(h>1) { sum[t]++; t=t+1; } long long ans=1; for(int i=0; i<t; i++) ans=ans*(sum[i]*6); printf("%lld\n",ans); } } }