题目描述
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).
思路
嵌套循环不行,只能先找出一个数,然后对下一个数二分求解。
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
long long n, a, b, mid, l, r, i;
int flag=0;
int main()
{
scanf("%lld", &n);
for (int i=1; i<sqrt((long double)2*n); i++){
a=i*(i+1)/2;
l=i, r=sqrt((long double)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)
printf("YES\n");
else
printf("NO\n");
return 0;
}