A. Funky Numbers
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
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.
#include<iostream>
using namespace std;
#include<algorithm>
int main()
{
int i=1,n,k,f=0,m1;
long long int sum1,sum2,sum,x,sum3=0,j=1;
scanf("%d",&n);
sum2=j*(j+1)/2;
while(1)
{
j=1;
sum1=i*(i+1)/2;
sum=n-sum1*2;
//printf("%d\n",sum);//
x=i+1;
//printf("%d\n",x);//
if(sum==0)
{
f=1;
break;
}
else if(sum<0){
break;
}
else
{
while(sum-sum3>0)
{
sum3=(x+x+j-1)*j/2;
if(sum-(x+x+(j+10000)-1)*(j+10000)/2>10)//优化速度,要不然会超时,【哭死】
{
j=j+10000;
}
else
j++;
//printf("%d\n",sum3);//
}
//printf("%d\n",sum-sum3);//
if(sum-sum3==0)
{
f=1;
break;
}
}
i++;sum3=0;
}
if(f==1)
printf("YES");
else
printf("NO");
//printf("\n%d",i);
//printf("\n");
/*for(j=10;j<100;j++)
{
printf("%d\n",j*(j+1)/2);
}*/
return 0;
}