GCD and LCM(hdu4497)

传送门

题意

给出 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)是两个不同的组合。

思路

  1. 明显地,若 l c m % g c d ≠ 0 lcm \% gcd \neq 0 lcm%gcd=0,则无解。
  2. 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
  3. 求满足 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)=1lcm(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)。
  4. 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
    1. 因为 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
    2. ( 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+(ci1)×A33=6ci
    3. 两 个 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]中的一个。 0cici00ci[1,ci1]
  5. 综上: 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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

to cling

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值