GCD and LCM
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 1024 Accepted Submission(s): 477
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.
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解决方案:gcd(x,y,z)=g,lcm(x,y,z)=l;若:x=g*a,b=g*b,c=g*c,则:t=l/g;lcm(a,b,c)=t;若t=2^A,则a,b,c中至少有一个数是2^A,一个是2^0,一个是2^0...2^A;所以共6种情况,这总个数为6*A;若t=2^A*3^B*5^C,总个数为6*A*6*B*6*C;code:#include <iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> using namespace std; const int maxn=100000; vector<int>GG; bool vis[maxn]; void prime() { GG.clear(); memset(vis,false,sizeof(vis)); vis[2]=true; GG.push_back(2); for(int i=3; i<maxn; i+=2) { if(!vis[i]) { GG.push_back(i); for(int j=i+i; j<maxn; j+=i)vis[j]=true; } } } int main() { int G,L,t; scanf("%d",&t); prime(); while(t--) { scanf("%d%d",&G,&L); if(L%G) { printf("0\n"); continue; } L=L/G; long long sum=1,cnt=0,len=GG.size(); for(int i=0; i<len; i++) { if(GG[i]>L) break; cnt=0; while(L%GG[i]==0) { L/=GG[i]; cnt++; } if(cnt!=0) sum*=(cnt*6); } if(L>1) sum*=6; printf("%lld\n",sum); } return 0; }