• 洛谷P1029 最大公约数和最小公倍数问题 [2017年6月计划 数论02]


    P1029 最大公约数和最小公倍数问题

    题目描述

    输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数

    条件:

    1.P,Q是正整数

    2.要求P,Q以x0为最大公约数,以y0为最小公倍数.

    试求:满足条件的所有可能的两个正整数的个数.

    输入输出格式

    输入格式:

    二个正整数x0,y0

    输出格式:

    一个数,表示求出满足条件的P,Q的个数

    输入输出样例

    输入样例#1:
    3 60
    
    输出样例#1:
    4
    

    说明

    P,Q有4种

    3 60 15 12 12 15 60 3

    本题一个比较重要的等式:a * b / gcd(a, b) = lcm(a, b)

    尤次,仅需枚举a,可求得b,然后判断gcd(a, b)是否为x0,同时由于精度问题,还应考虑求的b是否正确

    a的枚举:仅需枚举x0的倍数即可,同时应该小于等于y0的两倍,十分显然,

    #include <bits/stdc++.h>
    const int INF = 0x3f3f3f3f;
    inline int min(int a,int b){return a > b? b : a;}
    inline int max(int a,int b){return a < b? b : a;}
    inline int read(long long &x){
        x = 0;char ch = getchar();char c = ch;
        while(ch > '9' || ch < '0')c = ch, ch = getchar();
        while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0',ch = getchar();
        if(c == '-') x = -x;
    }
    long long gcd(long long a, long long b)
    {
        long long tmp;
        while(b > 0)
        {
            tmp = a % b;
            a = b;
            b = tmp;
        }
        return a;
    }
    
    long long x,y,k,j;
    int ans;
    int main(){
        read(x);read(y);
        k = x * y;
        y >>= 1;
        for(long long i = x;i <= y;i +=x)
        {
            j = k / i;
            if(i > j)break;
            if(j * i == k && gcd(i, j) == x)ans ++;
        }
        printf("%d", ans << 1);
        return 0;
    }
  • 相关阅读:
    iOS开发——keychain的使用
    iOS开发——策略模式
    iOS开发——MVC模式
    iOS开发——代理模式
    ExtjsCode_Test02Panel.js
    网站收藏
    关于ExtJs Form表单的赋值、获取、重置
    ExtJS分页start,limit,pageSize的研究
    使Grid可编辑
    如何禁用Grid中的ToolBar中的Button
  • 原文地址:https://www.cnblogs.com/huibixiaoxing/p/6964403.html
Copyright © 2020-2023  润新知