【算法实战】每日一题:18.3 ST表 - 给定一个整数序列和一系列区间查询,求每个查询区间内所有整数的最大公约数。

题目

给定一个整数序列和一系列区间查询,求每个查询区间内所有整数的最大公约数。

思路

上一节我们详细的学完ST表后,这里就比较好算了,直接把ST表的板子换一下增加一个GCD即可

解决方案

import math

def gcd(a, b):
    if b == 0:
        return a
    return gcd(b, a % b)

def build_gcd_arr(arr):
    n = len(arr)
    k = int(math.log2(n)) + 1
    gcd_arr = [[0] * k for _ in range(n)]

    for i in range(n):
        gcd_arr[i][0] = arr[i]

    j = 1
    while (1 << j) <= n:
        i = 0
        while i + (1 << j) - 1 < n:
            gcd_arr[i][j] = gcd(gcd_arr[i][j-1], gcd_arr[i + (1 << (j-1))][j-1])
            i += 1
        j += 1

    return gcd_arr

def query_gcd(gcd_arr, l, r):
    k = int(math.log2(r - l + 1))
    return gcd(gcd_arr[l][k], gcd_arr[r - (1 << k) + 1][k])

def main():
    n, m = map(int, input().split()) 
    arr = list(map(int, input().split()))

    gcd_arr = build_gcd_arr(arr)

    for _ in range(m):
        l, r = map(int, input().split())
        print(query_gcd(gcd_arr, l-1, r-1))

if __name__ == "__main__":
    main()


END

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-17 21:48:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-17 21:48:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-17 21:48:02       82 阅读
  4. Python语言-面向对象

    2024-06-17 21:48:02       91 阅读

热门阅读

  1. SAP PI系统关于接口清单和接口通量的自定义视图

    2024-06-17 21:48:02       28 阅读
  2. MYSQL 数字(Aggregate)函数

    2024-06-17 21:48:02       37 阅读
  3. 掌握.gitignore与标签(Tag)的高效使用

    2024-06-17 21:48:02       30 阅读
  4. 读《任正非文集》

    2024-06-17 21:48:02       35 阅读
  5. Python 学习 第二册 第14章 网络编程

    2024-06-17 21:48:02       28 阅读
  6. c++深拷贝、浅拷贝

    2024-06-17 21:48:02       33 阅读
  7. 视图和子查询

    2024-06-17 21:48:02       33 阅读
  8. 47-5 内网渗透 - 提权环境搭建

    2024-06-17 21:48:02       31 阅读
  9. 一千题,No.0077(计算谱半径)

    2024-06-17 21:48:02       36 阅读