您的位置:首页 > 其它

HDU 4497 GCD and LCM (数论)

2016-07-18 14:03 267 查看
题意:三个数x, y, z. 给出最大公倍数g和最小公约数l.求满足条件的x,y,z有多少组.

题解:设n=g/l n=p1^n1*p2^n2...pn^nk (分解质因数

  那么x = p1^x1 * p2^x2 * .... ^ pn^xk

    y = p1^y1 * p2^y2 * .... ^ pn^yk

    x = p1^z1 * p2^z2 * .... ^ pn^zk

那么对于任意i (0<=i<=k) 都有 min(xi, yi, zi) = 0, max(xi, yi, zi) = ni

于是枚举每一个质因数的分配情况即可得出答案.

对于每一个i pi ni

有一个因子要为pi^ni 有一个因子要为pi^0

于是一共有(ni+1)^3(所有情况) - ni^3(没有0) - ni^3(没有ni) + (ni-1)^3(既没有0也没有ni) 中情况

枚举出所有小于根号n 的因数 如果 没有除尽 剩下的是一个大的质因数

感悟:

应该算是比较水的题

但是由于很少做数论的题

所以总会觉得是因为有什么定理不会 所以不愿意去思考

也无从下手

以后碰到lcm和gcd的题 知道了有一个角度是分解质因数

#include <bits/stdc++.h>
using namespace std;

int main()
{
freopen("in", "r", stdin);
int T;
cin >> T;
while (T--) {
int g, l;
cin >> g >> l;
if (l % g) {
printf("0\n");
continue;
}
int n = l / g;
int limit = (int) sqrt((double)n);
int cnt, ans = 1;
for (int i = 2; i <= limit; ++i) {
if (n % i == 0) {
cnt = 0;
while (n % i == 0) {
n /= i;
cnt++;
}
ans *= cnt * 6;
}
}
if (n > 1) ans *= 6;
printf("%d\n", ans);
}
return 0;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: