码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 4497 GCD and LCM(排列组合)

时间:2014-07-22 22:59:36      阅读:304      评论:0      收藏:0      [点我收藏+]

标签:blog   http   io   2014   for   问题   

题目: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);
		}
	}
}


hdu 4497 GCD and LCM(排列组合),码迷,mamicode.com

hdu 4497 GCD and LCM(排列组合)

标签:blog   http   io   2014   for   问题   

原文地址:http://blog.csdn.net/u012997373/article/details/24842345

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!