AcWing 4656. 技能升级
原题链接
困难
"""
假设在答案中,所有升级的点数的最小值是mid(答案中升级的点数一定尽可能大)
# 那么一定有M个数 >= mid
# 且有不超过M个数 >= mid + 1,否则答案的最小值应该是mid + 1而非mid
# 枚举所有的mid,计算 >= mid的所有升级点数
# 但可能加的数超过M个,所以答案需要减去(cnt - m) * mid
"""
N, M = map(int, input().split())
A = [0]*N
B = [0]*N
cnt = [0]*N
for i in range(N):
A[i], B[i] = map(int, input().split())
def isOK(mid):
global cnt
cnt = [0] * N
for i in range(N):
cnt[i] = (A[i] - mid) // B[i] + 1 if A[i] - mid >= 0 else 0
if sum(cnt) >= M:
return True
return False
l, r = 0, 10 ** 6 + 10
while l + 1 < r:
mid = (l + r) // 2
if isOK(mid):
l = mid
else:
r = mid
res = 0
for i in range(N):
res += cnt[i] * A[i] - cnt[i] * (cnt[i] - 1) // 2 * B[i]
print(res - (sum(cnt) - M) * l)