首页 > 其他 > 详细

B. A and B(数学推导)

时间:2020-05-16 11:21:52      阅读:55      评论:0      收藏:0      [点我收藏+]

\(本文思路完全来源于\)starlet_kiss

\(\color{Red}{----------分割线-------------}\)

\(开始a,b,x=abs(a-b)\)

\(现在要求\pm1\pm2\pm3....\pm{n}=x\)

\(一开始我们一直加直到\color{Red}{超过x时停下}\)

\(1+2+3...+n=x+y(刚好超过了x,加到了x+y)\)

\(\color{Orange}{Ⅰ.当y为偶数,那么前面有一次\frac{y}{2}我们不加,而是减去它,就得到了x}\)

\(这种情况下,只需要操作n次即可(一定最优)\)

\(\color{Green}{Ⅱ.y为奇数,此时y不能被2整除}\)

\(那我们就构造出新的y为偶数\)

\(Ⅱ.1. \ 当n+1为奇数时\)

\(1+2+3...+(n+1)=x+y(此时y被构造成了偶数)\)

\(那么这时候需要操作n+1次\)

\(Ⅱ.2.\ 当n+1为偶数,那么n+2为奇数\)

\(1+2+3...+(n+2)=x+y(此时y被构造成了偶数)\)

\(那么此时需要操作n+2次\)

#include <bits/stdc++.h>
using namespace std;
#define int long long 
int n,m,t;
signed main()
{
	cin>>t;
	while(t--)
	{
		cin>>n>>m;
		int x=abs(n-m);
		int l=0,r=1e6,mid;
		while(r>l)
		{
			mid=(l+r)/2;
			if(mid*(mid-1)/2+mid>=x)	r=mid;
			else	l=mid+1;
		}
		int y=r*(r-1)/2+r-x;
		if(y%2==0)	cout<<r<<endl;
		else if((r+1)%2==1)	cout<<r+1<<endl;
		else	cout<<r+2<<endl;
	}
}

B. A and B(数学推导)

原文:https://www.cnblogs.com/iss-ue/p/12899524.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!