# -*- 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)