結果

問題 No.1036 Make One With GCD 2
ユーザー brthyyjp
提出日時 2020-06-08 04:25:12
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 1,207 bytes
コンパイル時間 1,763 ms
コンパイル使用メモリ 82,304 KB
実行使用メモリ 199,704 KB
最終ジャッジ日時 2024-12-24 02:44:24
合計ジャッジ時間 31,648 ms
ジャッジサーバーID
(参考情報)
judge5 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample WA * 4
other AC * 2 WA * 39
権限があれば一括ダウンロードができます

ソースコード

diff #

n = int(input())
A = list(map(int, input().split()))

if n == 1:
    print(0)
    exit()

import math
def segfunc(x, y):
    return math.gcd(x, y)

def init(init_val):
    # set_val
    for i in range(n):
        seg[i+num-1] = init_val[i]
    # built
    for i in range(num-2, -1, -1):
        seg[i] = segfunc(seg[2*i+1], seg[2*i+2])

def update(k, x):
    k += num - 1
    seg[k] = x
    while k:
        k = (k-1)//2
        seg[k] = segfunc(seg[2*k+1], seg[2*k+2])

def query(p, q):
    if q <= p:
        return ide_ele
    p += num - 1
    q += num - 2
    res = ide_ele
    while q-p>1:
        if p&1 == 0:
            res = segfunc(res, seg[p])
        if q&1 == 1:
            res = segfunc(res, seg[q])
            q -= 1
        p = p//2
        q = (q-1)//2
    if p == q:
        res = segfunc(res, seg[p])
    else:
        res = segfunc(segfunc(res, seg[p]), seg[q])
    return res

# identity element
ide_ele = 0

# num: n以上の最小の2のべき乗
num = 2**(n-1).bit_length()
seg = [ide_ele]*2*num

init(A)

p = 0
q = 0
ans = 0
for p in range(n):
    while q < n and query(p, q+1) != 1:
        q += 1
    ans += n-1-q+1
    print(p, q, ans)
    if p == q:
        q += 1
print(ans)
0