hdu 4497 GCD and LCM(排列组合)

题目:hdu 4497 GCD and LCM


题目大意:给出三个数的最大公约数,和最小公倍数,问这三个数的排列组合关系。


解题思路:最小公倍数/最大公约数 ==  三个数不同部分的乘积。这样来考虑的话,三个数都要有最大公约数的部分,其余的部分就是由LCM / GCD 里面的因子构成。这里面的因子可能会有 2 2 3 这样的情况, 不同的因子之间是不会相互干扰的,但是相同的会出现问题,因为,不能同时将相同的因子都放在三个位置上,这样最大公约数就的要乘上这个因子。然后对于单种因子来考虑的话,每种因子只能放在两个位置上这样就有 3 种选择,然后如果这类因子里有多个的话,一个放全部即n个这个因子,但是第二个可以放 0 。。 n个,分情况的话 1 。。 n - 1 的情况, 就有 3 *  2 (哪一堆拿来放满的) * (n - 1),  两个为空的那一种 3 * 1 , 还有一种是两个都是n个, 种类就是3 * 1 ,这样化简后就是6 * n。

推出这个后就只要把LCM / GCM 这个数拿来因式分解,得到每个不同的因子,代入公式计算就可意得到结果。


代码:

#include <stdio.h>
#include <math.h>

int t;

int main () {

	scanf ("%d", &t);
	int g, l, k, count, ans;
	while (t--) {

		scanf ("%d%d", &g, &l);
		ans = 1;
		if (l % g != 0)
			printf ("0\n");
		else {

			l /= g;
			k = sqrt(l);	
			for (int i = 2; i <= k; i++) {
				
				count = 0;
				if (l % i == 0) {

					while (l % i == 0) {

						l /= i;
						count++;
					}
				}
				if (count)
					ans *= 6 * count;
			}
			if (l != 1)
				ans *= 6;
			printf ("%d\n", ans);
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值