Задача о разложении на кубы с использованием рекурсии, программа выдает неверный ответ и нуждается в оптимизации

Всем привет, написала код по задаче:

Ограничения
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;
}

Ответы (0 шт):