結果

問題 No.3398 Accuracy of Integer Division Approximate Function 2
コンテスト
ユーザー 👑 Mizar
提出日時 2025-11-03 22:00:51
言語 Ruby
(4.0.0)
結果
AC  
実行時間 1,001 ms / 2,000 ms
コード長 1,236 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 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

ソースコード

diff #
raw source code

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
0