Задача о "счастливых билетах" реккурентно

Задача: "Вычислите количество N-значных счастливых билетов. Билет называется счастливым, если сумма первой половины его цифр равна сумме другой его половины"

Я смог решить эту задачу итерационно, однако на сайте http://www.ega-math.narod.ru/Quant/Tickets.htm нашел рекуррентный способ и попытался его реализовать:

#include <iostream>
#include <cmath>

using namespace std;

long long int recur_sm(long long int K, int n)
{
    if (K < 0) return 0;
    else if (n == 1 && K < 10) return 1;
    else
    {

        long long int temp = 0;

        for (int i = 0; i < 10; i++) temp += recur_sm(K - i, n - 1);

        return temp;

    }

}

int main()
{
    int N;
    cin >> N;

    long long int summ = 0;

    for (long long int k = 0; k <= 9 * N / 2; k++)
    {
        long long int c = recur_sm(k, N / 2);
        summ += c * c;

    }

    cout << "SUMMA:   " << summ << endl;

    return 0;
}

Но при N >= 4 выдает ошибку переполнения стека. Хотел знать, это ошибка моего кода, или комп не рассчитан на такую глубокую рекурсию?


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