首页 > 其他分享 >二十五 4199. 公约数 (最大公约数|二分)

二十五 4199. 公约数 (最大公约数|二分)

时间:2024-04-06 16:23:25浏览次数:31  
标签:right 4199 int private 最大公约数 static 公约数

4199. 公约数 (最大公约数|二分)
image

思路:先用求最大公约数的模板求出a与b的最大公约数d,然后得到从1到d的全部公约数,最后利用二分法找到满足l≤x≤r条件的最大的公约数x。

import java.util.*;

public class Main {
    private static int a, b, q, l, r, cnt;
    private static int[] cds = new int[1350];
    
    private static int gcd(int a, int b) {
        return b != 0 ? gcd(b, a % b) : a;
    }
    
    private static void init_divisors(int a, int b) {
        int d = gcd(a, b);
        cnt = 0;
        for (int i = 1; i <= d / i; i++) {
            if (d % i == 0) {
                cds[cnt++] = i;
                if (i != d / i) {
                    cds[cnt++] = d / i;
                }
            }
        }
        Arrays.sort(cds, 0, cnt);
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        a = sc.nextInt();
        b = sc.nextInt();
        init_divisors(a, b);
        q = sc.nextInt();
        while(q-- > 0) {
            l = sc.nextInt();
            r = sc.nextInt();
            int left = 0, right = cnt - 1;
            while (left < right) {
                int mid = left + right + 1 >> 1;
                if (cds[mid] <= r) {
                    left = mid;
                }
                else {
                    right = mid - 1;
                }
            }
            if (cds[right] >= l) {
                System.out.println(cds[right]);
            }
            else {
                System.out.println(-1);
            }
        }
    }
}

标签:right,4199,int,private,最大公约数,static,公约数
From: https://www.cnblogs.com/he0707/p/18117526/lanqiaobei25

相关文章

  • C语⾔编程题 计算最⼤公约数 和 打印最⼩公倍数
    1.计算最⼤公约数1.1 题⽬描述:      输⼊2个整数m和n,计算m和n的最⼤公约数,并打印出结果2.2解法思路:       最⼤公约数是指两个或多个整数共有约数中最⼤的⼀个。为了求出两个数的最⼤公约数,可以采⽤: •枚举试除法: 1.具体来说,公约数⼀定⼩于两个......
  • 求最大公约数的方法---pta---N个数求和
    公约数,简单来讲,可以被两个数都整除的一个数。最大公约数,就是两个数的所有公约数中最大的那一个。求得方法有很多,比如://枚举法inta,b,t;cin>>a>>b;for(inti=1;i<=min(a,b);i++){if(a%i==0&&b%i==0){t=i;}}cout<<t;//辗转相除法:inta,b,t;cin>>a>>b;......
  • 【前端面试3+1】07vue2和vue3的区别、vue3响应原理及为什么使用proxy、vue的生命周期
    一、vue2和vue3的区别1.性能优化:        Vue3在性能方面有很大的提升,主要是通过虚拟DOM的优化和响应式系统的改进实现的。虚拟DOM重构:Vue3中对虚拟DOM进行了重构,使得更新算法更加高效,减少了更新时的开销,提升了性能。静态树提升:Vue3可以通过静态树提升技术......
  • P8792 [蓝桥杯 2022 国 A] 最大公约数
    #include<iostream>#include<stdio.h>#include<algorithm>#include<string>#include<cmath>#defineFor(i,j,n)for(inti=j;i<=n;++i)usingnamespacestd;constintN=1e5+5;intgcd(intx,inty){re......
  • 求两个数的最大公约数 和 求两个数的最小公倍数
    求两个数的最大公约数题目内容:输入两个正整数num1和num2(不超过1000),求它们的最大公约数并输出。我们定义求最大公约数的函数为hcf,给出程序主体如下:num1=int(input(""))num2=int(input(""))print(hcf(num1,num2))请补充完成hcf函数的定义。 输入格式:共两行,每一行输入一......
  • 十 1360. 有序分数 (最大公约数|递归)
    1360.有序分数(最大公约数|递归)方法一思路:统计所有组合,并求其最大公约数是否为1,只有最大公约数为1的组合才成立,然后按组成的分数大小顺序排序。importjava.util.*;publicclassMain{privatestaticintgcd(inta,intb){returnb==0?a:gcd(b......
  • NOJ南邮上机 最大公约数和最小公倍数 PROB1006 Python
    PROB1006  最大公约数和最小公倍数描述:求两个正整数的最大公约数和最小公倍数输入:两个正整数A,B输出:两个正整数的最大公约数、最小公倍数样例输入:43样例输出:112defmax_gcd(a,b):whileb!=0:temp=a%ba=bb=temp......
  • 246. 区间最大公约数
    #include<cstdio>#include<cstring>#include<iostream>#include<algorithm>usingnamespacestd;typedeflonglongLL;constintN=500010;intn,m;LLw[N];structNode{intl,r;LLsum,d;}tr[N*4];LLgcd(LL......
  • 对最大公约数求法和扩展欧几里得算法的简要概述
    目录1.最大公约数(gcd)1.1更相减损术时间复杂度分析1.2辗转相除法(欧几里得算法)时间复杂度分析2.最小公倍数(lcm)3.裴蜀定理(贝祖定理)3.1扩展欧几里得算法(exgcd)1.最大公约数(gcd)数论中,通常用\(d\|\a\)表示\(d\)能整除\(a\),即\(......
  • 最大公约数和最小公倍数
    一、问题描述P1029[NOIP2001普及组]最大公约数和最小公倍数问题二、问题简析2.1最大公约数求两个正整数的最大公约数gcd(greatestcommondivisor),最常用的方法是辗转相除法。//求a和b的最大公约数intgcd(inta,intb){ if(b==0)returna; returngcd(a,......