(数学题,式子并不难推,但边界是真的烦)
(color{Red}{Ⅰ.其实可以发现,当m>=n时,每次都可以粮食补到n,所以一定是在第n天消耗完毕})
(color{Purple}{Ⅱ.当n>m时,前m天每次粮食都补到n})
(设从m+1天开始,需要mid天消耗完毕)
(因为每天都可以加m粮食,所以mid天可以加X_{补充}=(mid-1)*m粮食(因为第m+1天是补满前一天的,所以是mid-1))
(然后麻雀带走的粮食用等差数列计算m+1,m+2,...,m+mid)
[也就是X_{消耗}=mid*(m+1)+(mid-1)*mid/2
]
然后因为消耗的粮食要大于补充的粮食
[得到X_{消耗}>=n+X_{补充}
]
[化简得到m+mid*(mid+1)/2>=n可行
]
(根据这个二分即可。)
(但是r的边界多少呢?我因为这个wa了无数次,边界应该是r=2e9)
(这样二分的时候刚好不会超过long long)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,ans;
int main()
{
cin>>n>>m;
if(n<=m)
{
cout<<n;
return 0;
}
ans=m;//有m天补不全
ll l=0,r=2e9,mid;
while(r>l)
{
mid=(l+r)/2;
if(m+mid*(mid+1)/2>=n) r=mid;
else l=mid+1;
}
cout<<ans+r;
}