結果
問題 | No.1036 Make One With GCD 2 |
ユーザー |
![]() |
提出日時 | 2024-08-14 20:44:40 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 849 ms / 2,000 ms |
コード長 | 5,831 bytes |
コンパイル時間 | 474 ms |
コンパイル使用メモリ | 82,176 KB |
実行使用メモリ | 231,016 KB |
最終ジャッジ日時 | 2024-08-14 20:45:04 |
合計ジャッジ時間 | 22,092 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 41 |
ソースコード
from collections import defaultdictfrom math import gcdclass Segment_Tree:def __init__(self,N,f,e,lst=None,dynamic=False,bisect_search=True):self.f=fself.e=eself.N=Nself.bisect_search=bisect_searchif self.bisect_search:self.le=1while self.le<self.N:self.le*=2else:self.le=self.Nif dynamic:self.segment_tree=defaultdict(lambda:self.e)else:if lst==None:self.segment_tree=[self.e]*2*self.leelse:assert len(lst)<=self.leself.segment_tree=[self.e]*self.le+[x for x in lst]+[self.e]*(self.le-len(lst))for i in range(self.le-1,0,-1):self.segment_tree[i]=self.f(self.segment_tree[i<<1],self.segment_tree[i<<1|1])def __getitem__(self,i):if type(i)==int:if -self.le<=i<0:return self.segment_tree[i+self.le*2]elif 0<=i<self.le:return self.segment_tree[i+self.le]else:raise IndexError("list index out of range")else:a,b,c=i.start,i.stop,i.stepif a==None:a=self.leelse:a+=self.leif b==None:b=self.le*2else:b+=self.lereturn self.segment_tree[slice(a,b,c)]def __setitem__(self,i,x):if -self.le<=i<0:i+=self.le*2elif 0<=i<self.le:i+=self.leelse:raise IndexError("list index out of range")self.segment_tree[i]=xwhile i>1:i>>= 1self.segment_tree[i]=self.f(self.segment_tree[i<<1],self.segment_tree[i<<1|1])def Build(self,lst):for i,x in enumerate(lst,self.le):self.segment_tree[i]=xfor i in range(self.le-1,0,-1):self.segment_tree[i]=self.f(self.segment_tree[i<<1],self.segment_tree[i<<1|1])def Fold(self,L=None,R=None):if L==None:L=self.leelse:assert 0<=L<=self.leL+=self.leif R==None:R=self.le*2else:assert 0<=R<=self.leR+=self.levL=self.evR=self.ewhile L<R:if L&1:vL=self.f(vL,self.segment_tree[L])L+=1if R&1:R-=1vR=self.f(self.segment_tree[R],vR)L>>=1R>>=1return self.f(vL,vR)def Fold_Index(self,L=None,R=None):if L==None:L=self.leelse:assert 0<=L<=self.leL+=self.leif R==None:R=self.le*2else:assert 0<=R<=self.leR+=self.leif L==R:return Nonex=self.Fold(L-self.le,R-self.le)while L<R:if L&1:if self.segment_tree[L]==x:i=LbreakL+=1if R&1:R-=1if self.segment_tree[R]==x:i=RbreakL>>=1R>>=1while i<self.le:if self.segment_tree[i]==self.segment_tree[i<<1]:i<<=1else:i<<=1i|=1i-=self.lereturn idef Bisect_Right(self,L=None,f=None):assert self.bisect_searchif L==self.le:return self.leif L==None:L=0assert 0<=L<=self.leL+=self.levl=self.evr=self.el,r=L,self.le*2while l<r:if l&1:vl=self.f(vl,self.segment_tree[l])l+=1if r&1:r-=1vr=self.f(self.segment_tree[r],vr)l>>=1r>>=1if f(self.f(vl,vr)):return self.Nv=self.ewhile True:while L%2==0:L>>=1vv=self.f(v,self.segment_tree[L])if f(vv):v=vvL+=1else:while L<self.le:L<<=1vv=self.f(v,self.segment_tree[L])if f(vv):v=vvL+=1return L-self.ledef Bisect_Left(self,R=None,f=None):assert self.bisect_searchif R==0:return 0if R==None:R=self.leassert 0<=R<=self.leR+=self.levl=self.evr=self.el,r=self.le,Rwhile l<r:if l&1:vl=self.f(vl,self.segment_tree[l])l+=1if r&1:r-=1vr=self.f(self.segment_tree[r],vr)l>>=1r>>=1if f(self.f(vl,vr)):return 0v=self.ewhile True:R-=1while R>1 and R%2:R>>=1vv=self.f(self.segment_tree[R],v)if f(vv):v=vvelse:while R<self.le:R=2*R+1vv=self.f(self.segment_tree[R],v)if f(vv):v=vvR-=1return R+1-self.ledef __str__(self):return "["+", ".join(map(str,[self.segment_tree[i] for i in range(self.le,self.le+self.N)]))+"]"N=int(input())A=list(map(int,input().split()))ST=Segment_Tree(N,gcd,0,A)ans=0r=0for l in range(N):while r<N and ST.Fold(l,r+1)!=1:r+=1ans+=N-rprint(ans)