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)!
Input
The first input line contains an integer n (1 ≤ n ≤ 109).
Output
Print "YES" (without the quotes), if n can be represented as a sum of two triangular numbers, otherwise print "NO" (without the quotes).
Examples
Input
256
Output
YES
Input
512
Output
NO
Note
In the first sample number .
In the second sample number 512 can not be represented as a sum of two triangular numbers.
题意: 给你一个数N,问是否存在N = A+B = k1*(k1+1)/2 + k2(k2+1)/2
思路:上式等价于 2*N = k1*(k1+1) + k2*(k2+1) 如果两层for循环肯定超时,时间复杂度O(n^2),所以一个对Afor循环+一个对B二分,O(n∗logn)
代码:
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
int main()
{
ll n,A,B,mid,l,r;
cin>>n;
int flag=0;
for(int 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) break;
}
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}