D - Funky Numbers (CodeForces - 192A)
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,是否有满足的A、B的值。
思路:如果用两个for循环遍历一定会超时,我们可以遍历A,然后用二分去寻找B,这样会很大程度上减少耗时。
代码参考:
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<math.h>
#define ll long long
using namespace std;
int main()
{
ll n;
while(~scanf("%lld",&n))
{
ll i,A,B,p=0;
for(i=1;i<sqrt(2*n);i++)
{
A=i*(i+1)/2;
ll l=i,r=sqrt(2*n),m=(l+r)/2;
while(l<=r)
{
B=m*(m+1)/2;
if(A+B<n)
{
l=m+1;
m=(l+r)/2;
}
else if(A+B>n)
{
r=m-1;
m=(l+r)/2;
}
else
{
p=1;
break;
}
}
if(p==1)
break;
}
if(p==1)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}