C. Anton and Fairy Tale(数学推式子)

\(数学题,式子并不难推,但边界是真的烦\)

\(\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;
}
posted @ 2020-05-06 16:49  倾叶子佮  阅读(147)  评论(0编辑  收藏  举报