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.
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
Source
题目分析:
已知:gcd(x,y,z) = g; lcm(x,y,z) = l 。因为l = x * y* z /g 所以当 l % g != 0 时,无解。
将满足条件的一组x,y,z都 除以g,得到x',y',z'。满足条件 gcd(x',y',z') = 1,同时 lcm(x',y',z')= g/l;
我们对 l/g 进行素数分解 l/g = p1^t1+p2^t2+······+p^n+tn;
同时:
x' = p1^i1+p2^i2+······+pn^in;
y' = p1^j1+p2^j2+······+pn^jn;
z' = p1^k1+p2^k2+······+pn^kn;
则一定有:
对于p1 == max(i1,j1,k1); 0 == min(i1,j1,k1) 我们假设, i1 == 0, j1 == t1, 则 k1>=0&&k1<=t1;则,当k1 == 0 或k1==t1时, i1 j1 k1 有三种组合情况 ( 0 0 ti )(0 t1 0) (t1 0 0)/(t1 t1 0) (t1 0 t1) (0 t1 t1)
对于其他的k1 ,i1 j1 k1 的组合情况有6种,所以最后产生了 6*(t1-1)+3*2 = 6*t1 种情况。
所以对每一个分解出来的质数,我们累乘 6 *ti 便是最后的组合情况
#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;
}