HDU 4497 GCD and LCM 素因子
阿新 • • 發佈:2018-12-24
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
程式碼及註釋如下:
/* 此題的G和L範圍在int範圍內,所以求其中的最大素因子不超過100000; 所以第一步需要求出1-10萬中的素數,然後儲存到vector陣列中... 第二步就是求個數了.. 如果LCM不能除盡GCD的話,說明不能組成,直接輸出0. 如果能夠除盡,L需要先除以G,將兩個數的公共素因子冪全部消去... 最後是素因子分解L. 每分解一個素因子就用6*素因子的指數.... 答案就是素因子的指數乘6累成起來的... */ #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <vector> using namespace std; const int maxn=100000; vector<int>pri; int isnot[maxn+5]; int t; int x,y; int Size; void Judge () { memset (isnot,0,sizeof(isnot)); isnot[1]=1; for (int i=2;i<=maxn;i++) { if(!isnot[i]) { pri.push_back(i); for (int j=2*i;j<=maxn;j+=i) isnot[j]=1; } } Size=pri.size(); } int main() { Judge(); scanf("%d",&t); while (t--) { int num=1; scanf("%d%d",&x,&y); if(y%x) printf("0\n"); else { y/=x; for (int i=0;i<Size;i++) { int cnt=0; if(pri[i]*pri[i]>y) break; while(y%pri[i]==0) { cnt++; y/=pri[i]; } if(cnt) num*=6*cnt; } if(y!=1) num*=6; printf("%d\n",num); } } return 0; }