結果
| 問題 | No.3398 Accuracy of Integer Division Approximate Function 2 |
| コンテスト | |
| ユーザー |
👑 |
| 提出日時 | 2025-11-18 23:17:01 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 396 ms / 2,000 ms |
| コード長 | 1,533 bytes |
| 記録 | |
| コンパイル時間 | 174 ms |
| コンパイル使用メモリ | 12,160 KB |
| 実行使用メモリ | 10,752 KB |
| 最終ジャッジ日時 | 2025-12-04 23:32:58 |
| 合計ジャッジ時間 | 3,999 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 20 |
ソースコード
# (Python3/PyPy3): Compute xmin(D,A,B,K), return -1 if not exists
# Δ(D,A,B,x) = floor(x/D) - floor(floor(x/A) * floor(AB/D) / B)
# xmin(D,A,B,K) = min{x ∈ ℕ | K < Δ(D,A,B,x)}
def mwf(L: int, R: int, m: int, a: int, b: int, c: int, d: int) -> int:
assert L < R and 0 < m
n = R - L
qd0, d = divmod(c * L + d, m)
max_acc = sum_acc = a * L + b * qd0
while True:
qc, c = divmod(c, m)
a += b * qc
qd, d = divmod(d, m)
sum_acc += b * qd
y_max = (c * (n - 1) + d) // m
max_acc = max(max_acc, sum_acc, sum_acc + a * (n - 1) + b * y_max)
if y_max == 0 or (a >= 0 and b >= 0) or (a <= 0 and b <= 0):
return max_acc
if a < 0:
sum_acc += a + b
n, m, a, b, c, d = y_max, c, b, a, m, (m - d - 1)
def compute_xmin(D: int, A: int, B: int, K: int) -> int:
import math
assert D > 0 and A > 0 and B > 0 and K >= 0
gcd_DA = math.gcd(D, A)
Dred, Ared, Tdelta = D // gcd_DA, A // gcd_DA, B * K
Mred, Rred = divmod(Ared * B, Dred)
if Rred == 0 and Dred * K + 1 >= Ared:
return -1
lo, hi = 0, Ared * B * K + 2
while lo + 1 < hi:
mid = (lo + hi) // 2
if mwf(lo, mid, Ared, B, -Mred, Dred, 0) <= Tdelta:
lo = mid
else:
hi = mid
return D * lo
if __name__ == "__main__":
import sys
T = int(sys.stdin.readline())
for _ in range(T):
D, A, B, K = map(int, sys.stdin.readline().split())
print(compute_xmin(D, A, B, K))