关于#C++#的问题,如何解决?

DEV-C++问题
用到的代码最好不要太高级
题目描述
一定数目的点或圆在等距离的排列下可以堆成一个等边三角形。

前 6 个三角形堆分别需要 1 3 6 10 15 21个点。

img

第 n 三角形数是从 开始的n 个自然数的和,即 n(n+1)/2

给定一个正整数x,请你判断 x 个圆 能否构成两个三角形堆(可以相同)。

输入输出格式
输入格式:
测试含多组数据,第一行为T
接下来T行,每行一个正整数 x。

输出格式:
输出T行,如果 x 可以表示为两个三角形数之和,则输出 YES,否则输出 NO。

输入输出样例
输入样例#1:
2
256
512
输出样例#1:
YES
NO
提示信息
数据范围
前 6 个测试点满足 1≤x≤1000。
所有测试点满足 1≤x≤10^9。

全网最详细讲解(三种解法):

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

非常简单!

#include<bits/stdc++.h>
using namespace std;
long long ans,n,mi=1e9,k,a,s[10000001],j;
map<int,int> b;
int main()
{
    for(int i=1;i<=20000;i++){
        s[i]=s[i-1]+i;
        b[s[i]]=1;
    }
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a;
        int biao=0;
        for(int j=1;j<=20000;j++){
            if(b[a-s[j]]==1){
                cout<<"YES"<<endl;
                biao=1;
                break;
            }
        }
        if(biao==0) cout<<"NO"<<endl;
    }

    return 0;
}