結果
| 問題 | 
                            No.1036 Make One With GCD 2
                             | 
                    
| コンテスト | |
| ユーザー | 
                             titia
                         | 
                    
| 提出日時 | 2025-05-14 06:25:15 | 
| 言語 | PyPy3  (7.3.15)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 821 ms / 2,000 ms | 
| コード長 | 1,344 bytes | 
| コンパイル時間 | 384 ms | 
| コンパイル使用メモリ | 82,784 KB | 
| 実行使用メモリ | 190,312 KB | 
| 最終ジャッジ日時 | 2025-05-14 06:25:36 | 
| 合計ジャッジ時間 | 19,737 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge3 / judge5 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 4 | 
| other | AC * 41 | 
ソースコード
import sys
input = sys.stdin.readline
from math import gcd
N=int(input())
A=list(map(int,input().split()))
def seg_function(x,y): # Segment treeで扱うfunction
    return gcd(x,y)
seg_el=1<<(N.bit_length()) # Segment treeの台の要素数
SEG=[0]*(2*seg_el) # 1-indexedなので、要素数2*seg_el.Segment treeの初期値で初期化
for i in range(N): # Aを対応する箇所へupdate
    SEG[i+seg_el]=A[i]
for i in range(seg_el-1,0,-1): # 親の部分もupdate
    SEG[i]=seg_function(SEG[i*2],SEG[i*2+1])
def update(n,x,seg_el): # A[n]をxへ更新
    i=n+seg_el
    SEG[i]=x
    i>>=1 # 子ノードへ
    
    while i!=0:
        SEG[i]=seg_function(SEG[i*2],SEG[i*2+1])
        i>>=1
        
def getvalues(l,r): # 区間[l,r)に関するseg_functionを調べる
    L=l+seg_el
    R=r+seg_el
    ANS1=0
    ANS2=0
    while L<R:
        if L & 1:
            ANS1=seg_function(ANS1, SEG[L])
            L+=1
        if R & 1:
            R-=1
            ANS2=seg_function(SEG[R], ANS2)
        L>>=1
        R>>=1
    return seg_function(ANS1, ANS2)
ANS=0
OK=0
for i in range(N):
    if A[i]==1:
        ANS+=N-i
    else:
        OK=max(OK,i)
        while OK<N:
            if OK+1<N and getvalues(i,OK+2)!=1:
                OK+=1
            else:
                break
        ANS+=(N-i)-(OK-i+1)
print(ANS)
            
            
            
        
            
titia