結果
問題 | No.3048 Swing |
ユーザー |
|
提出日時 | 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 |
ソースコード
## 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))