GCD and LCM
原题链接 http://acm.hdu.edu.cn/showproblem.php?pid=4497
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
由题意得,L一定是G的倍数,x,y,z的gcd一定是lcm的因子,令K = L / G, xx = x / G, yy = y / G, zz = z / G.
那么xx,yy,zz的lcm为K,gcd为1. K = p1^n1 * p2^n2 * ...。对于第i个质因子ansi,它在三元组中的出现情况只能是必须出现一次ans1^n 或者必须出现一次ans1^0 和有一个的元素的因子为ans1^m (0 <= m < n),所以对于素因子ans共有6*ni种情况,结果为ans1*6*ans2*6*ans3*6…
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 1000010
using namespace std;
int tree[MAXN];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int G,L;
scanf("%d%d",&G,&L);
memset(tree,0,sizeof tree);
if(L%G)
{
printf("0\n");
continue;
}
int l=L/G,sum=0;
for(int i=2; i<=l; i++)
{
if(l%i==0)
{
while(l%i==0)
{
tree[sum]++;
l/=i;
}
sum++;
}
}
if(l>1)
{
tree[sum++]++;
}
int ans=1;
for(int i=0; i<sum; i++)
{
if(tree[i])
{
ans*=(tree[i]*6);
}
}
printf("%d\n",ans);
}
return 0;
}