結果

問題 No.3398 Accuracy of Integer Division Approximate Function 2
コンテスト
ユーザー 👑 Mizar
提出日時 2025-11-03 22:08:05
言語 Ruby
(4.0.0)
結果
AC  
実行時間 310 ms / 2,000 ms
コード長 1,520 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 206 ms
コンパイル使用メモリ 8,064 KB
実行使用メモリ 13,056 KB
最終ジャッジ日時 2025-12-04 23:31:47
合計ジャッジ時間 4,393 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 20
権限があれば一括ダウンロードができます
コンパイルメッセージ
Syntax OK

ソースコード

diff #
raw source code

# -*- coding: utf-8 -*-

def mwf_leq(z, n, m, a, b, c, d)
  raise ArgumentError unless n > 0 && m > 0

  sum_acc = -z
  loop do
    q, c = c.divmod(m)
    a += b * q
    q, d = d.divmod(m)
    sum_acc += b * q

    return false if sum_acc > 0

    y_max = (c * (n - 1) + d) / m

    if y_max == 0
      return (sum_acc + a * (n - 1)) <= 0
    end

    if sum_acc + [0, a * (n - 1)].max + [0, b * y_max].max <= 0
      return true
    end

    if a >= 0
      return false if (sum_acc + a * (n - 1) + b * y_max) > 0
    else
      sum_acc += a + b
    end

    n, m, a, b, c, d = y_max, c, b, a, m, (m - d - 1)
  end
end


def mwf_lr_leq(z, l, r, m, a, b, c, d)
  raise ArgumentError unless l < r && m > 0

  n = r - l
  q, d = (c * l + d).divmod(m)
  mwf_leq(z - a * l - b * q, n, m, a, b, c, d)
end


def compute_xmin_leq(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_lr_leq(tdelta, lo, mid, ared, b, -mred, dred, 0)
      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)
    raise unless 1 <= d && 1 <= a && 1 <= b && 0 <= k
    ans = compute_xmin_leq(d, a, b, k)
    puts ans
  end
end


if __FILE__ == $0
  solve
end
0