HDU 4497 GCD and LCM(分解质因子+排列组合)
2015-09-04 10:26
274 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4497
题意:已知GCD(x, y, z) = G,LCM(x, y, z) = L。告诉你G、L,求满足要求的(x, y, z)有多少组,并且要考虑顺序。
思路:如果L%G != 0显然不存在这样的(x, y, z),相反肯定存在。具体做法就是将L/G分解质因子,得到:L/G = P1^t1 * P2^t2 * ... * Pk^tk,我们来考虑任意一个因子Pi^ti,此时(x/G, y/G, z/G) = (x0, y0,z0)将x0,y0,z0分别分解质因子,得到对应位为Pi^t1, Pi^t2,Pi^t3,为了满足要求,(t1, t2, t3)中一定有一个为0(三个数互质),(t1, t2, t3)中一定有一个为ti且剩下的一个小于等于ti(三个数的最小公倍数为L/G)。min(t1, t2, t3) = 0, max(t1, t2, t3) = ti,所有情况就为6*ti(排列组合或者容斥原理),最后的答案就是(6*t1) * (6*t2) * ... * (6*tk)。
code:
题意:已知GCD(x, y, z) = G,LCM(x, y, z) = L。告诉你G、L,求满足要求的(x, y, z)有多少组,并且要考虑顺序。
思路:如果L%G != 0显然不存在这样的(x, y, z),相反肯定存在。具体做法就是将L/G分解质因子,得到:L/G = P1^t1 * P2^t2 * ... * Pk^tk,我们来考虑任意一个因子Pi^ti,此时(x/G, y/G, z/G) = (x0, y0,z0)将x0,y0,z0分别分解质因子,得到对应位为Pi^t1, Pi^t2,Pi^t3,为了满足要求,(t1, t2, t3)中一定有一个为0(三个数互质),(t1, t2, t3)中一定有一个为ti且剩下的一个小于等于ti(三个数的最小公倍数为L/G)。min(t1, t2, t3) = 0, max(t1, t2, t3) = ti,所有情况就为6*ti(排列组合或者容斥原理),最后的答案就是(6*t1) * (6*t2) * ... * (6*tk)。
code:
#include <cstdio> int main() { int nCase; scanf("%d", &nCase); while (nCase--) { int L, G; scanf("%d %d", &G, &L); if (L % G) { printf("0\n"); continue; } L /= G; int ans = 1; for (int i = 2; i * i <= L; ++i) { if (L % i == 0) { int t = 0; while (L % i == 0) { L /= i; ++t; } ans *= (6 * t); } } if (L != 1) ans *= 6; printf("%d\n", ans); } return 0; }
相关文章推荐
- android之VideoView和视频播放View的扩展
- 天声人語 20150904
- PAT(B) 1026. 程序运行时间
- (统计查询)一句sql统计多个状态的
- Nqueen1.0
- Hello JSP!——<jsp:include>动作元素篇
- 如何在现有的项目中使用CUDA
- C++RemoveReference
- 1639 - Candy (数学期望)
- QTableView与QStandardItemModel基本使用方法
- 包含min函数的栈
- java大牛的博客
- TQ2440 学习笔记—— 26、ADC 和触摸屏接口
- zzuli OJ 1091: 童年生活二三事(多实例测试)
- poj 3061 (挑战程序设计竞赛3.2.1)
- xcode使用
- 在QThread中使用QTimer
- C语言中变量定义的位置
- 使用类和对象
- for循环三角形