给出两个数n和m, (n,m<=1e18)
有一堆谷共有n颗,
第i天会发生的事:
给这堆谷最多加m颗,最多加到n。
有i只鸟会吃掉i颗,若不足i颗则吃光。
问第几天会吃光。
">Anton and Fairy Tale
Anton and Fairy Tale
Created by LXC on Fri Apr 28 11:56:29 2023
https://codeforces.com/problemset/problem/785/C
ranting: 1600
tag: binary search, math
题意
给出两个数n和m, (n,m<=1e18)
有一堆谷共有n颗,
第i天会发生的事:
- 给这堆谷最多加m颗,最多加到n。
- 有i只鸟会吃掉i颗,若不足i颗则吃光。
问第几天会吃光。
题解
当m>=n时,必须等到n天才能吃光
否则,
前m天后谷物仍然没有减少。
第m+i天开始,每天会减少m+i颗,但是第二天会增加m。
那么第m+i天鸟吃完后的谷子为f(i) = n-(1+i)*i/2-m
。f(i)单调递减,二分找到第一个f(i)<=0则是答案。
注意溢出。
这个还是有精度问题。n-(1+i)*i/2-m<=0
变形 sqrt(2*(n-m)-i) <= i
我们注意到如果经过10^9天那么谷粒将减少大概10^18颗。
所以二分的上界取10^9数量级就行了,比如2e9
找到第一个(1+i)*i/2<=n-m,i in [0, 1e9]。答案为m+i
代码
1 |
|