有定理任意自然数能用不多于3的三角形数表示。。那么直接暴力枚举吧,。
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
namespace
{
vector<int> V;
void init()
{
int num, n = 0;
while (++n)
{
num = n * (n + 1) / 2;
if (num <= 123456789)
V.push_back(num);
else
break;
}
}
int single(int num)
{
if (binary_search(V.begin(), V.end(), num))
return num;
else
return 0;
}
pair<int, int> doublee(int num)
{
for (size_t i = 0; V[i] <= num / 2; i++)
if (binary_search(V.begin(), V.end(), num - V[i]))
return make_pair(V[i], num - V[i]);
return make_pair(0, 0);
}
int result(int num)
{
return (sqrt(8 * num + 1) - 1) / 2;
}
}
int main()
{
init();
int T, N;
scanf("%d", &T);
while (T--)
{
scanf("%d", &N);
if (single(N))
printf("%d\n", result(N));
else
{
pair<int, int> p = doublee(N);
if (p.first)
printf("%d %d\n", result(p.first), result(p.second));
else
for (size_t i = 0; V[i] <= 1 + N / 3; i++)
{
p = doublee(N - V[i]);
if (p.first)
{
printf("%d %d %d\n", result(V[i]), result(p.first),
result(p.second));
break;
}
}
}
}
return 0;
}