解体的思路:
Total Submission(s): 690 Accepted Submission(s): 319
lcm(x,y,z)=k;
gcd(x,y,z)=t;
若:x=a*t; y=b*t; z=c*t;
则lcm(a,b,c)=k/t;
若k/t=2^A;
则a,b,c中至少有一个数为2^A,至少有一个数是2^0,另外一个数为2^(0~A);共6*A种情况。
则,若k/t=2^A*3^B*5^C;
a,b,c的情况数为:(6*A)*(6*B)*(6*C);
PS:从鹏哥那里偷来的,他说的比较清楚。
GCD and LCM
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 690 Accepted Submission(s): 319
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
#include <algorithm>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <iomanip>
#include <stdio.h>
#include <string>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <set>
#define eps 1e-7
#define M 1000100
#define LL __int64
//#define LL long long
#define INF 0x3f3f3f3f
#define PI 3.1415926535898
using namespace std;
const int maxn = 5000010;
int f[maxn];
int p[maxn];
int t;
void prime()
{
t = 0;
int n = maxn/2;
memset(f, 0 , sizeof(f));
for(int i = 4; i <= n; i += 2)
f[i] = 1;
for(int i = 3; i <= n; i += 2)
{
for(int j = 2*i; j <= n; j += i)
f[j] = 1;
}
for(int i = 2; i <= n; i++)
if(!f[i])
p[t++] = i;
}
int num[100010];
int main()
{
prime();
int T;
cin >>T;
while(T--)
{
int n, k;
cin >>n>>k;
int site = 0;
memset(num, 0, sizeof(num));
if(n == k)
cout<<"1"<<endl;
else if(k%n)
cout<<"0"<<endl;
else
{
int m = k/n;
for(int i = 0; i < t; i++)
{
int flag = 0;
while(1)
{
if(m%p[i] == 0)
{
m/=p[i];
flag = 1;
num[site]++;
}
else
{
if(flag)
site++;
break;
}
}
}
if(m != 1)
num[site++] = 1;
LL sum = 1;
for(int i = 0; i < site; i++)
sum *= num[i]*6;
cout<<sum<<endl;
}
}
}