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)!
The first input line contains an integer n (1 ≤ n ≤ 109).
Print "YES" (without the quotes), if n can be represented as a sum of two triangular numbers, otherwise print "NO" (without the quotes).
256
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.
题意:输入一个数n,问这个数是否满足:n = A*(A+1)/2 + B*(B+1)/2。因为数据范围是1e9,所以可以打表计算a*(a+1)/2,然后二分枚举。具体请看代码。
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define ll long long
ll a[150005];
int main() {
for(int i = 1; i <= 150000; i++) { //打表
a[i] = i*(i+1)/2;
}
ll n;
while(~scanf("%lld", &n)) {
bool flag = false;
ll m = sqrt(2*n);
for(int i = 1; i <= m; i++) {
ll val = n - a[i];
if(val <= 0) break;
int l = lower_bound(a+i, a+m+1, val)-a;
int u = upper_bound(a+i, a+m+1, val)-a;
if(l != u) { //查找
flag = true;
break;
}
}
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}