根据题意,在等差数列 f(x)=2*x-1 中,选取尽可能少的元素,使得元素总和等于x。
若 (x+y) 不是平方数,或 x==2 ,或 y==2 ,那么x、y不合法,输出-1。
先在等差数列的后面几项中,选取 f(down) ~ f(up),使得其和刚好不小于x。
若其和刚好等于x,那么明显就是这几项。若大于x,则可以有某个元素不选,选取down项前面某个较小的元素,使得其和等于x。
值得注意的是,要判断奇偶性。由于f(i)均为奇数,所以若选取的项数为奇数,而x为偶数,或者项数为偶数,x为奇数,是不符合条件的。要额外选取1个元素填补奇偶性的差异,即答案+1。
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long T,x,y,sum,num,up,down,ans;
cin>>T;
while(T--)
{
scanf("%lld%lld",&x,&y);
sum=x+y;
num=(long long)sqrt(sum);
if(num*num!=sum||x==2||y==2)
{
printf("-1\n");
continue;
}
up=min(num,(x+1)>>1);
down=(long long)sqrt(up*up-x)+1;
ans=up-down+1;
if( (((ans&1)==0)&&(x&1)==1) || ((ans&1)==1&&(x&1)==0))
ans++;
printf("%lld\n",ans);
}
}