代码拉取完成,页面将自动刷新
# -*- coding: utf-8 -*-
# @project : 《Atcoder》
# @Author : created by bensonrachel on 2021/9/6
# @File : TPM(step2)G. Coprime Segment(单调栈).py
from collections import deque
from math import gcd
import sys
MAX_INT = sys.maxsize
class stk:
def __init__(self):
"""
Initialize your data structure here.
"""
self.que = deque()
self.gcd_dp = deque()
self.gcd_dp.append(0)
def push(self, x: int) -> None:
"""
Push element x to the back of queue.
每次做一次GCD即可
"""
self.que.append(x)
temp = self.gcd_dp[-1]
self.gcd_dp.append(gcd(temp,x))
def pop(self) -> None:
"""
Removes the element from in front of queue and returns that element.
"""
tmp = self.que.pop()
tmp2 = self.gcd_dp.pop()
def peek(self) -> int:
"""
Get the front element.
"""
return self.que[-1]
def empty(self) -> bool:
"""
Returns whether the queue is empty.
"""
return not self.que
def get(self) -> int:
"""
"""
return self.gcd_dp[-1]
def query(s1,s2):
"""
:param s1:
:param s2:
:return: 一个区间的gcd等于这个区间分成前后两部分的gcd的结果再做一次gcd
"""
dp1 = s1.get()
dp2 = s2.get()
return gcd(dp1,dp2) == 1
def remove(s1,s2):
if(s1.empty()):
while(not s2.empty()):
s1.push(s2.peek())
s2.pop()
s1.pop()
def TPM():
s1 = stk()
s2 = stk()
l = 0
res = MAX_INT
for r in range(n):
s2.push(a[r])
while(l <= r and query(s1,s2)):#这里也while(query(l,r)>k):,l=r时有可能这个数就是1,不同于st表的方法。
res = min(res,r-l+1)
remove(s1,s2)
l += 1
if(res > n):
res = -1
return res
if __name__ == '__main__':
n = int(input())
a = [int(i) for i in input().split()]
ans = TPM()
print(ans)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。