题目:Funky Numbers(二分)

版权声明:本文为博主原创文章,欢迎转载。如有问题,欢迎指正。 https://blog.csdn.net/weixin_42172261/article/details/87067479

题目描述
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;
}

猜你喜欢

转载自blog.csdn.net/weixin_42172261/article/details/87067479