結果

問題 No.1884 Sequence
ユーザー gew1fw
提出日時 2025-06-12 20:46:19
言語 PyPy3
(7.3.15)
結果
RE  
実行時間 -
コード長 1,986 bytes
コンパイル時間 425 ms
コンパイル使用メモリ 81,792 KB
実行使用メモリ 135,372 KB
最終ジャッジ日時 2025-06-12 20:46:27
合計ジャッジ時間 7,193 ms
ジャッジサーバーID
(参考情報)
judge1 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 38 RE * 2
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys
import math

def readints():
    return list(map(int, sys.stdin.readline().split()))

def main():
    N = int(sys.stdin.readline())
    A = readints()
    S = [x for x in A if x != 0]
    K = N - len(S)
    if len(S) == 0:
        print("Yes")
        return
    elif len(S) == 1:
        print("Yes")
        return
    S.sort()
    diffs = []
    for i in range(1, len(S)):
        diffs.append(S[i] - S[i-1])
    d = math.gcd(diffs[0], diffs[1])
    for diff in diffs[2:]:
        d = math.gcd(d, diff)
    if d == 0:
        all_same = True
        first = S[0]
        for s in S:
            if s != first:
                all_same = False
                break
        if all_same:
            print("Yes")
        else:
            print("No")
        return
    r = S[0] % d
    max_S = S[-1]
    lower = max(max_S - (N-1)*d, 1)
    upper = S[0]
    if lower > upper:
        print("No")
        return
    mod = lower % d
    if mod == r:
        a = lower
    else:
        delta = (r - mod + d) % d
        a = lower + delta
        if a > upper:
            print("No")
            return
    valid = True
    for s in S:
        if (s - a) % d != 0:
            valid = False
            break
        m = (s - a) // d
        if m < 0 or m >= N:
            valid = False
            break
    if not valid:
        print("No")
        return
    count_filled = 0
    for i in range(N):
        val = a + i * d
        if val <= 0:
            print("No")
            return
        low = 0
        high = len(S) - 1
        found = False
        while low <= high:
            mid = (low + high) // 2
            if S[mid] == val:
                found = True
                break
            elif S[mid] < val:
                low = mid + 1
            else:
                high = mid - 1
        if not found:
            count_filled += 1
    if count_filled == K:
        print("Yes")
    else:
        print("No")

if __name__ == "__main__":
    main()
0