As you very well know, this year's funkiest numbers are so called triangular numbers (that is, integers that are representable as , where k is some positive integer), and the coolest numbers are those that are representable as a sum of two triangular numbers.
A well-known hipster Andrew adores everything funky and cool but unfortunately, he isn't good at maths. Given number n, help him define whether this number can be represented by a sum of two triangular numbers (not necessarily different)!
InputThe first input line contains an integer n (1 ≤ n ≤ 109).
OutputPrint "YES" (without the quotes), if n can be represented as a sum of two triangular numbers, otherwise print "NO" (without the quotes).
Examples256
YES
512
NO
In the first sample number .
In the second sample number 512 can not be represented as a sum of two triangular numbers.
两个循环搜索会超时,所以第二个使用二分搜索
#include <iostream>
#include <math.h>
using namespace std;
typedef long long ll;
int main(){
ll n,i,A,B,mid,r,l;
cin>>n;
int flag=0;
for(i=1;i<sqrt(2*n);i++){
A=i*(i+1)/2;
l=i;r=sqrt(2*n);mid=(l+r)/2;
while(l<=r){
B=mid*(mid+1)/2;
if(A+B<n){
l=mid+1;
mid=(l+r)/2;
}
else if(A+B>n){
r=mid-1;
mid=(l+r)/2;
}
else{
flag=1;
break;
}
}
if(flag==1)
break;
}
if(flag==1)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return 0;
}