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的形式,ab为整数
思路:二分
遍历所有可能的a找是否有对应的b满足条件
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <stack>
#include <cstring>
#include <queue>
#include <algorithm>
#define ll long long
#define max_ 1000010
#define inf 0x3f3f3f3f
using namespace std;
ll n;
int main(int argc, char const *argv[]) {
scanf("%lld",&n);
int f=0;
for(ll i=1;i<=sqrt(2*n);i++)
{
ll d=2*n-(i*i+i);
ll l=1,r=sqrt(2*n);
while(l<=r)
{
int mid=(l+r)>>1;
if(mid*mid+mid==d)
{
f=1;
break;
}
if(mid*mid+mid>d)
r=mid-1;
else
l=mid+1;
}
}
if(f)
printf("YES\n" );
else
printf("NO\n" );
return 0;
}