# GCD and LCM

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)
Total Submission(s): 3002    Accepted Submission(s): 1315

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

Source

x' = p1^i1+p2^i2+······+pn^in;

y' = p1^j1+p2^j2+······+pn^jn;

z' = p1^k1+p2^k2+······+pn^kn;

#include<bits/stdc++.h>
#define LL long long
using namespace std;

const int MAX = 1e7+10;
const int INF = 0x3fffffff;
int g,l;
int a[MAX];
int p[1000000+10];
int num = 0;

void init(){//素数打表
memset(a,0,sizeof(a));
memset(p,0,sizeof(p));
for(int i=2;i<=MAX;i++){
if(!a[i]){
p[num++] = i;
for(int j=2;i*j<=MAX;j++){
a[i*j] = 1;
}
}
}
}

int main(){
init();
int t;
cin>>t;
while(t--){
int ans = 0;
scanf("%d%d",&g,&l);
if(l%g!=0){
printf("0\n");
continue;
}
l/=g;
ans = 1;
for(int i=0;p[i]<=l;i++)//质数分解
if(l%p[i]==0){
int t=0;
while(l%p[i]==0){
l/=p[i];
t++;
}
ans=ans*t*6;//前面的解释。
}
printf("%d\n",ans);
}
return 0;
}