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.
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.
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#include <iostream> #include <stdio.h> using namespace std; #define MAXN 50000 int arrp[MAXN]; int vis[MAXN]; int k; void get_prime() { k=0; vis[2]=0; for(int i=2;i<MAXN;i++) { if(!vis[i]) { arrp[k++]=i; for(int j=i;j<MAXN;j+=i) vis[j]=1; } } } int main() { //freopen("data.in","r",stdin); get_prime(); int T,g,l; scanf("%d",&T); while(T--) { scanf("%d%d",&g,&l); if(l%g) { printf("0\n"); continue; } int tmp=l/g; int cnt,ans=1; for(int i=0;i<k;i++) { if(arrp[i]*arrp[i]>tmp) break; if(tmp%arrp[i]!=0) continue; cnt=0; while(tmp%arrp[i]==0) { tmp/=arrp[i]; cnt++; } ans*=(3+3+6*(cnt-1)); ///上面三个数分别表示: ///只有一个含质该因子;有两个含该因子且均是arrp[i]^cnt;有两个含该因子且只有一个是arrp[i]^cnt,另一个有cnt-1种情况 } if(tmp>1) ans*=(3+3+6*(1-1)); printf("%d\n",ans); } return 0; }