結果

問題 No.3048 Swing
ユーザー 37zigen
提出日時 2025-01-20 22:43:22
言語 Python3
(3.13.1 + numpy 2.2.1 + scipy 1.14.1)
結果
AC  
実行時間 31 ms / 2,000 ms
コード長 1,015 bytes
コンパイル時間 577 ms
コンパイル使用メモリ 12,032 KB
実行使用メモリ 10,240 KB
最終ジャッジ日時 2025-06-20 02:20:35
合計ジャッジ時間 3,742 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 62
権限があれば一括ダウンロードができます

ソースコード

diff #

## a, a+d, a+2d, .., b の和
def rangesum(a, b, d):
    if not a <= b:
        return 0
    b = a + (b - a) // d * d
    return (b + a) * ((b - a) // d + 1) // 2


## 1+2+..+i >= A となる最小の i
def f(A):
    ok = A
    ng = 0
    while ok - ng > 1:
        m = (ok + ng) // 2
        if rangesum(1, m, 1) >= A:
            ok = m
        else:
            ng = m
    return ok



def exact(x, n):
    for i in range(1, n + 1):
        if x <= 0:
            x += i
        else:
            x -= i
    return x


def solve(x, n):
    if x <= 0:
        m = min(n, f(-x + 1))
        x += rangesum(1, m, 1)
    else:
        m = min(n, f(x))
        x -= rangesum(1, m, 1)
    m += 1
    if m <= n:
        sum0 = rangesum(m, n, 2)
        sum1 = rangesum(m + 1, n, 2)
        if x > 0:
            x -= sum0
            x += sum1
        else:
            x += sum0
            x -= sum1
    return x
x, n = map(int, input().split())
assert -10**18 <= x <= 10**18
assert 1 <= n <= 10**18
print(solve(x, n))
0