这题双倍mxr数是两个mxr数的和,所以,开个哈希表将所有1e9以内的mxr数先存一下;注意k*(k+1) 可能会爆int,最好用LL存储计算。然后遍历哈希表的键,查看n-key是否也在哈希表里; 最多存储1e9开根号个mxr 数字,也就是时间复杂度和空间复杂度都在10^5 以内这个量级,是OK的。
#include <iostream>
#include <unordered_map>
using namespace std;
typedef long long LL;
unordered_map<int, bool> mp;
int main()
{
for (int i = 0; (LL)i * (i + 1) <= 1e9; i ++ )
mp[i * (i + 1)] = true;
int n;
cin >> n;
n = 2 * n;
for (auto it: mp)
{
if (2 * it.first < n && mp[n - it.first] == true)
{
cout << "YES" << endl;
return 0;
}
}
cout << "NO";
return 0;
}