题意:给你一个数字N,问你是否存在两个数字A,B使得
N=A(A+1)2+B(B+1)2
思路:上面这个式子等价于
2N=A(A+1)+B(B+1)
,最简单想到的方法就是两重for循环枚举A,B的值从
1−n√
,这样复杂度为
n2
,看一下数据范围为
1≤n≤109
,限制时间为2s,
n2
复杂度肯定超时,所以我们可以枚举一个A,然后二分寻找B,这样复杂度为
n∗logn
的两秒应该能过去。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
int flag=0;
for(int i=1;i<sqrt(2*n);i++)
{
int A=i*(i+1)/2;
int low=i,high=sqrt(2*n),mid=(low+high)/2;
while(low<=high)
{
int B=mid*(mid+1)/2;
if(A+B<n)
{
low=mid+1;mid=(low+high)/2;
}
else if(A+B>n)
{
high=mid-1;mid=(low+high)/2;
}
else if(A+B==n)
{
flag=1;break;
}
}
if(flag==1)
{
break;
}
}
if(flag==0)
{
cout<<"NO"<<endl;
}
else
{
cout<<"YES"<<endl;
}
}
return 0;
}