Задача о разложении на кубы с использованием рекурсии, программа выдает неверный ответ и нуждается в оптимизации
Всем привет, написала код по задаче:
Ограничения
1 сек.
64 MiB
Известно, что любое натуральное число можно представить в виде суммы не
более чем четырех квадратов натуральных чисел. Вася решил придумать
аналогичное утверждение для кубов - он хочет узнать, сколько кубов
достаточно для представления любого числа. Его первая рабочая гипотеза - восемь.
Выяснилось, что почти все чиcла, которые Вася смог придумать, представляются
в виде суммы не более чем восьми кубов. Однако число 239, например, не
допускает такого представления. Теперь Вася хочет найти какие-либо другие
такие числа, а также, возможно, какую-либо закономерность в представлениях
всех остальных чисел, чтобы выдвинуть гипотезу относительно вида всех чисел,
которые не представляются в виде суммы восьми кубов.
Помогите Васе написать программу, которая проверяла бы, возможно ли
представить данное натуральное число в виде суммы не более чем восьми
кубов натуральных чисел, и если это возможно, то находила бы какое-либо
такое представление.
Входные данные
Вводится натуральное число N <= 2*10^9.
Выходные данные
Требуется вывести не более восьми натуральных чисел, кубы которых в сумме дают N.
Если искомого представления не существует, то в выходной файл необходимо вывести слово IMPOSSIBLE.
Примеры
входные данные
239
выходные данные
IMPOSSIBLE
входные данные
17
выходные данные
2 2 1
Но код на некоторых тестах он выдает неверный ответ, к тому же, не проходит по времени, помогите, пожалуйста, исправить его и ускорить!!! Мой код:
#include <iostream>
#include <vector>
using namespace std;
bool f(long long n, long long control, vector<long long>& a) {
if (n == 0 && control >= 0) {
return true;
}
if (control == 0 and n > 0) {
return false;
}
for (int i = n; i >= 1; i--) {
a.push_back(i);
if (f(n - i * i * i, control - 1, a)) {
return true;
}
a.pop_back();
}
return false;
}
int main() {
long long n;
cin >> n;
vector<long long> a;
if (f(n, 8, a)) {
for (auto& x : a) {
cout << x << " ";
}
} else {
cout << "IMPOSSIBLE";
}
return 0;
}