arc 050 B - 花束 (python)
二分探索2つめ。
答えを n と仮定したときに n が条件を満たすかどうかは
(a, b) = (x, 1)*k + (1, y) * (n - k) とおいたときに、R >= a かつ B >= b を満たす 0以上 n以下の整数 k が存在することと同値である。
(厳密にはさらに n <= min(a, b) も必要)
これを正負に注意して展開すると、(r - n)/(x - 1) >= k >= (n * y - b)/(y - 1)となり
k が整数なので求める条件は、 (n * y - b - 1)//(y - 1) + 1 <= (r - n)//(x - 1) となる。
いちいち答えの上限pを考えて WA を量産しまくったので最初から10**18 とかにしておけばよかった。
x,y = [int(i) for i in input().split()] b,a = map(int,input().split()) p = min(max(x,y)*2//3,min(x,y)) def is_ok(n): global x,y,b,a return (n*b-x-1)//(b-1)+1 <= (y-n)//(a-1) def meguru_bisect(ng, ok): while (abs(ok - ng) > 1): mid = (ok + ng) // 2 if is_ok(mid): ok = mid else: ng = mid return ok print(meguru_bisect(p+1,-1))