题意
给出 g c d ( x , y , z ) , l c m ( x , y , z ) gcd(x, y, z),lcm(x, y, z) gcd(x,y,z),lcm(x,y,z),求出所有满足条件的 ( x , y , z ) (x, y, z) (x,y,z)组合的数量。注意: ( 1 , 2 , 3 ) 和 ( 1 , 3 , 2 ) (1, 2 , 3) 和(1, 3, 2) (1,2,3)和(1,3,2)是两个不同的组合。
思路
- 明显地,若 l c m % g c d ≠ 0 lcm \% gcd \neq 0 lcm%gcd=0,则无解。
- 设 d = l c m / g c d , d = q 1 c 1 × q 2 c 2 × q 3 c 3 × ⋯ × q m c m d = lcm / gcd, \quad d = q_1^{c_1} \times q_2^{c_2} \times q_3^{c_3}\times \cdots \times q_m^{c_m} d=lcm/gcd,d=q1c1×q2c2×q3c3×⋯×qmcm
- 求满足 g c d ( x , y , z ) , l c m ( x , y , z ) gcd(x, y, z),lcm(x, y, z) gcd(x,y,z),lcm(x,y,z)的组合数等价于求满足 g c d ( a , b , c ) = 1 , l c m ( a , b , c ) = d gcd(a, b, c) = 1,lcm(a, b, c) = d gcd(a,b,c)=1,lcm(a,b,c)=d的组合数。此处a,b,c实质上是gcd的倍数( a = x / d , b = y / d , c = z / d a = x/d, b = y/d, c = z / d a=x/d,b=y/d,c=z/d)。
-
a
=
q
1
A
1
×
q
2
A
2
×
⋯
×
q
m
A
m
a = q_1^{A_1} \times q_2^{A_2} \times \cdots \times q_m^{A_m}
a=q1A1×q2A2×⋯×qmAm
b = q 1 B 1 × q 2 B 2 × ⋯ × q m B m b = q_1^{B_1} \times q_2^{B_2} \times \cdots \times q_m^{B_m} b=q1B1×q2B2×⋯×qmBm
c = q 1 C 1 × q 2 C 2 × ⋯ × q m C m c = q_1^{C_1} \times q_2^{C_2} \times \cdots \times q_m^{C_m} c=q1C1×q2C2×⋯×qmCm- 因为 g c d ( a , b , c ) = 1 gcd(a, b, c) = 1 gcd(a,b,c)=1,所以 m i n ( A i , B i , C i ) = 0 , m a x ( A i , B i , C i ) = c i min(A_i, B_i,C_i) = 0, max(A_i, B_i,C_i) = c_i min(Ai,Bi,Ci)=0,max(Ai,Bi,Ci)=ci。
- ( A i , B i , C i ) 的 组 合 数 = 3 + 3 + ( c i − 1 ) × A 3 3 = 6 c i (A_i, B_i, C_i)的组合数 = 3 + 3 + (c_i - 1) \times A_3^3 = 6c_i (Ai,Bi,Ci)的组合数=3+3+(ci−1)×A33=6ci
- 两 个 0 一 个 c i , 两 个 c i 一 个 0 , 一 个 0 一 个 c i 剩 下 一 个 任 选 [ 1 , c i − 1 ] 中 的 一 个 。 两个0一个c_i,两个c_i一个0,一个0一个c_i剩下一个任选[1, c_i -1]中的一个。 两个0一个ci,两个ci一个0,一个0一个ci剩下一个任选[1,ci−1]中的一个。
- 综上: a n s = 6 c 1 × 6 c 2 × ⋯ × 6 c m ans = 6c_1 \times 6c_2 \times \cdots \times 6c_m ans=6c1×6c2×⋯×6cm
#include<cstdio>
#include<queue>
#include<set>
#include<cstdlib>
#include<string.h>
#include<string>
#include<iostream>
#include<cmath>
#include<unordered_map>
#include<map>
#include<algorithm>
#define endl "\n"
#define IOS ios::sync_with_stdio(0), cin.tie(0),cout.tie(0)
#define ft first
#define sd second
#define pll pair<ll, ll>
#define pii pair<int, int>
#define ll long long int
#define ull unsigned long long int
#define mt(a,b) memset(a, b, sizeof a)
//#define int long long
const double PI = acos(-1.0);
const int inf = 0x3f3f3f3f;
const int INF = 0x7fffffff;
using namespace std;
const int N = 1e5 + 7, M = 1e6 + 10;
ll c[100], m;
void div(ll n)
{
m = 0;
int q = sqrt(n);
for (int i = 2; i <= q; i++)
{
if (n % i == 0)
{
m++;
c[m] = 0;
while (n % i == 0) n /= i, c[m]++;
}
}
if (n > 1) c[++m] = 1;
}
int main()
{
IOS;
int T; cin >> T;
while (T--)
{
ll gcd, lcm; cin >> gcd >> lcm;
if (lcm % gcd) cout << 0 << endl;
else
{
ll ans = 1;
ll d = lcm / gcd;
div(d);
for(int i = 1; i <= m; i++)
ans *= 6 * c[i];
cout << ans << endl;
}
}
return 0;
}