2172. 最大公约数

news/2024/10/21 20:43:46/

Powered by:NEFU AB-IN

Link

文章目录

  • 2172. 最大公约数
    • 题意
    • 思路
    • 代码

2022年第十三届决赛真题

2172. 最大公约数

  • 题意

    给定一个数组, 每次操作可以选择数组中任意两个相邻的元素 x , y x, yx,y 并将其 中的一个元素替换为 gcd ⁡ ( x , y ) \operatorname{gcd}(x, y)gcd(x,y), 其中 gcd ⁡ ( x , y ) \operatorname{gcd}(x, y)gcd(x,y) 表示 x xx 和 y yy 的最大公约数。 请问最少需要多少次操作才能让整个数组只含 1 。

  • 思路

    流程图如下
    img
    其中两个互质元素的最短距离,可以这么求:

    • 首先,目的就是为了让数组中变出一个1,而题目中只让相邻gcd,所以两个互质的不能直接gcd
    • 所以我们要进行区间gcd,找到最短长度的区间,使得gcd=1
      • 如abcde,a与e互质,其实相当于a或e中无一个质因子相同,所以也就是a和b进行gcd,然后b肯定会带上a的因子,否则b就是1,然后一直到e
    • 可以采用二分双指针,找最短长度区间
    • 可以采用st表线段树,求区间gcd
  • 代码

    '''
    Author: NEFU AB-IN
    Date: 2023-05-24 12:47:50
    FilePath: \LanQiao\2172\2172.py
    LastEditTime: 2023-05-24 14:52:22
    '''
    # import
    from sys import setrecursionlimit, stdin, stdout, exit
    from collections import Counter, deque
    from heapq import heapify, heappop, heappush, nlargest, nsmallest
    from bisect import bisect_left, bisect_right
    from datetime import datetime, timedelta
    from string import ascii_lowercase, ascii_uppercase
    from math import log, gcd, sqrt, fabs, ceil, floorclass sa:def __init__(self, x, y):self.x = xself.y = ydef __lt__(self, a):return self.x < a.x# Final
    N = int(1e5 + 10)
    M = 20
    INF = int(2e9)# Define
    setrecursionlimit(INF)
    input = lambda: stdin.readline().rstrip("\r\n")  # Remove when Mutiple data
    read = lambda: map(int, input().split())
    LTN = lambda x: ord(x.upper()) - 65  # A -> 0
    NTL = lambda x: ascii_uppercase[x]  # 0 -> A# —————————————————————Division line ——————————————————————
    a = [0] * N
    dp = [[0] * M for _ in range(N)]
    Log = [0] * Ndef init():for j in range(M):i = 1while i + (1 << j) - 1 <= n:if j == 0:dp[i][j] = a[i]else:dp[i][j] = gcd(dp[i][j - 1], dp[i + (1 << (j - 1))][j - 1])i += 1Log[1] = 0for i in range(2, N):Log[i] = Log[i >> 1] + 1def query(l, r):k = Log[r - l + 1]return gcd(dp[l][k], dp[r - (1 << k) + 1][k])n, = read()
    a[1:] = read()init()
    cnt = sum(i == 1 for i in a)
    if cnt > 0:print(n - cnt)exit(0)if query(1, n) != 1:print(-1)exit(0)ans = INFfor i in range(1, n + 1):l, r = i, nwhile l < r:mid = (l + r) >> 1if query(i, mid) == 1:r = midelse:l = mid + 1if query(i, r) == 1:ans = min(ans, r - i)print(ans + n - 1)
    

http://www.ppmy.cn/news/77070.html

相关文章

go手写Redis(8)之数据库核心层及指令实现

数据库核心层 前面实现完了处理器的逻辑&#xff0c;现在到了核心的数据层实现了&#xff0c;核心的数据库主要是来执行用户发送的指令并且进行数据存储 1. Database 数据层的顶级接口定义&#xff0c;在 interface/database/database.go 文件中定义&#xff0c; 其中定义了…

[C++/PTA] 立方体类的实现

[C/PTA] 立方体类的实现 题目要求解题思路代码总结 题目要求 立方体类Box的实现&#xff0c;完成计算体积、计算表面积、输出结果等功能。其中给定的主函数为&#xff1a; int main( ){float ab;cin>>ab;Box obj;obj.seta( ab );obj.getvolume( );obj.getarea( );obj…

齐聚手机赛道:小度朝左,蔚来向右

经过多年的发展&#xff0c;智能手机可以说已经发展到了人手一台的地步了&#xff0c;普及率之高可见一斑。然而&#xff0c;如今的智能手机却没有延续高增长态势&#xff0c;反而出现了销量下滑的情况。据Canalys公布的数据显示&#xff0c;2022年全球智能手机出货量不足12亿部…

ov2640子设备视频操作详细分析

ov2640子设备视频操作详细分析 文章目录 ov2640子设备视频操作详细分析ov2640_subdev_video_ops视频操作ov2640_s_stream开始流ov2640_g_fmt 获取格式ov2640_s_fmt设置格式ov2640_try_fmt尝试格式ov2640_cropcap裁剪能力ov2640_g_crop获取裁剪ov2640_enum_fmt枚举格式ov2640_g_…

充实你的Android开发工具箱:无效数据处理的方案

&#x1f604;&#x1f604;个人介绍 光子郎.进行开发工作七年以上&#xff0c;目前涉及全栈领域并进行开发。会经常跟小伙伴分享前沿技术知识&#xff0c;java后台、web前端、移动端&#xff08;Android&#xff0c;uniapp&#xff0c;小程序&#xff09;相关的知识以及经验体…

Mit6.006-lecture09-Breadth-First-Search

一、新单元&#xff1a;图 Quiz 1包含lecture01到lecture08&#xff0c;关注数据结构和排序 今天开始新单元&#xff0c;lecture09-lecture14&#xff0c;关注图算法 二、图应用 图无处不在 任何网络系统都存在有向连接图 比如&#xff1a;路网、计算机网络、社交网络 任…

实现取关和关注功能

将关注过的用户id存如数据库中 //关注或者取关 Override public Result follow(Long id, Boolean flag) { //1.获取当前登录用户的id UserDTO user UserHolder.getUser(); if(usernull){ return Result.fail("请先登录"); } Long userId user.getId(); //2.判断是关…

【Java EE 初阶】网络初识

目录 1.网络互连 1.局域网&#xff1a; 2.广域网WAN 2.网络通信基础 3.IP地址&#xff1a;端口号 4.协议 1.五元组 2.协议分层 1.为什么要用网络分层&#xff1f; 3.OSI七层模型 4.TCP/IP五层&#xff08;或四层&#xff09;模型 5.封装和分用 1.应用层 2.传输层A…