結果
問題 | No.1036 Make One With GCD 2 |
ユーザー |
![]() |
提出日時 | 2020-04-26 02:25:03 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 775 ms / 2,000 ms |
コード長 | 1,482 bytes |
コンパイル時間 | 374 ms |
コンパイル使用メモリ | 82,304 KB |
実行使用メモリ | 199,220 KB |
最終ジャッジ日時 | 2024-09-16 14:08:18 |
合計ジャッジ時間 | 19,387 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge6 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 41 |
ソースコード
from math import gcdclass SegTree:def __init__(self, init_val, n, ide_ele, seg_func):self.segfunc = seg_funcself.num = 2**(n-1).bit_length()self.ide_ele = ide_eleself.seg=[self.ide_ele]*2*self.numfor i in range(n):self.seg[i+self.num-1]=init_val[i]for i in range(self.num-2,-1,-1) :self.seg[i]=self.segfunc(self.seg[2*i+1],self.seg[2*i+2])def update(self, k, x):k += self.num-1self.seg[k] = x# k+1ではなくkでは?while k+1:k = (k-1)//2self.seg[k] = self.segfunc(self.seg[k*2+1],self.seg[k*2+2])def query(self, p, q):if q<=p:return self.ide_elep += self.num-1q += self.num-2res=self.ide_elewhile q-p>1:if p&1 == 0:res = self.segfunc(res,self.seg[p])if q&1 == 1:res = self.segfunc(res,self.seg[q])q -= 1p = p//2q = (q-1)//2if p == q:res = self.segfunc(res,self.seg[p])else:res = self.segfunc(self.segfunc(res,self.seg[p]),self.seg[q])return resn = int(input())X = list(map(int, input().split()))st = SegTree(X, n, 0, gcd)j = 1r = 0for i in range(n):while j <= n:if st.query(i, j) == 1:breakj += 1r += n+1-j# print(i, j)print(r)