結果
| 問題 | No.3398 Accuracy of Integer Division Approximate Function 2 |
| コンテスト | |
| ユーザー |
👑 |
| 提出日時 | 2025-11-03 22:00:51 |
| 言語 | Ruby (4.0.0) |
| 結果 |
AC
|
| 実行時間 | 1,001 ms / 2,000 ms |
| コード長 | 1,236 bytes |
| 記録 | |
| コンパイル時間 | 748 ms |
| コンパイル使用メモリ | 7,936 KB |
| 実行使用メモリ | 13,056 KB |
| 最終ジャッジ日時 | 2025-12-04 23:31:43 |
| 合計ジャッジ時間 | 8,031 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 20 |
コンパイルメッセージ
Syntax OK
ソースコード
def mwf(n, m, a, b, c, d)
raise ArgumentError unless n > 0 && m > 0
sum_acc = 0
max_acc = b * (d / m)
loop do
q, c = c.divmod(m)
a += b * q
q, d = d.divmod(m)
sum_acc += b * q
raise unless 0 <= c && c < m && 0 <= d && d < m
max_acc = [max_acc, sum_acc].max
y_max = (c * (n - 1) + d) / m
if y_max == 0
return [max_acc, sum_acc + a * (n - 1)].max
end
if a >= 0
max_acc = [max_acc, sum_acc + a * (n - 1) + b * y_max].max
else
sum_acc += a + b
end
n, m, a, b, c, d = y_max, c, b, a, m, (m - d - 1)
end
end
def compute_xmin(d, a, b, k)
raise ArgumentError unless d > 0 && a > 0 && b > 0 && k >= 0
gcd_da = d.gcd(a)
dred = d / gcd_da
ared = a / gcd_da
mred, rred = (ared * b).divmod(dred)
tdelta = b * k
return -1 if rred == 0 && dred * k + 1 >= ared
lo = 0
hi = ared * b * k + 2
while lo + 1 < hi
mid = (lo + hi) / 2
if mwf(mid, ared, b, -mred, dred, 0) <= tdelta
lo = mid
else
hi = mid
end
end
d * lo
end
def solve
t = STDIN.readline.to_i
t.times do
d, a, b, k = STDIN.readline.split.map(&:to_i)
ans = compute_xmin(d, a, b, k)
puts ans
end
end
if __FILE__ == $0
solve
end