zoukankan      html  css  js  c++  java
  • HDU 4497 GCD and LCM (数论)

    题意:三个数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
    ");
                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
    ", ans);
        }
        return 0;
    }

      

  • 相关阅读:
    Oracle Cannot Update TOP N Issue, 请专家解答
    .NET 匿名方法的BUG,请专家解答
    那些年我们追过的SQL
    迁移至csdn
    Vuejs的一些总结
    CSS命名规范——BEM思想
    Vuejs的一些总结
    shadow-dom 浅析
    javascript 对象封装的常用方式
    JavaScript的性能优化:加载和执行
  • 原文地址:https://www.cnblogs.com/wenruo/p/5680985.html
Copyright © 2011-2022 走看看