Помогите с задачей с++

Количество маршрутов в прямоугольной таблице В прямоугольной таблице N×M вначале игрок находится в левой верхней клетке. За один ход ему разрешается перемещаться в соседнюю клетку либо вправо, либо вниз (влево и вверх перемещаться запрещено). Посчитайте, сколько есть способов у игрока попасть в правую нижнюю клетку.

Входные данные

Вводятся два числа N и M — размеры таблицы 1≤N≤10,1≤M≤10.

Выходные данные

Выведите искомое количество способов. Мое решение. Пишет неверный ответ

#include <iostream> 
using namespace std;
int fucktorial(long long i)
{
    if (i == 0) return 1;
    else return i * fucktorial(i - 1);
}
int main() {
    long long n, m, res;
    cin >> n >> m;
    m -= 1;
    n -= 1;
    res = fucktorial(n + m) / (fucktorial(n) * fucktorial(m - n));
    cout << res;
    return 0;
} ```

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

Автор решения: n1tr0xs
  1. Если введут m < n, то все "накроется медным тазом". Потому что m-n < 0, а фактрориал уйдет в беск. рекурсию.
  2. Лучше избегать рекурсии там, где это возможно
#include <iostream>

using namespace std;

long long fact(int n){
    long long f = 1;
    for(int i=2; i<=n; ++i)
        f *= i;
    return f;
}


int main(){
    int n, m;
    long long res;
    cin >> n >> m;
    m -= 1;
    n -= 1;
    res = fact(m+n) / (fact(n) * fact(abs(m-n)));
    cout << res;
    return 0;
}
→ Ссылка
Автор решения: Harry

Попробуйте так:

cin >> n >> m;
--n; --m;
unsigned long long p = 1;
for(int i = n+1; i <= n+m; ++i) p*= i;
for(int i = 2; i <= m; ++i) p/= i;

cout << p;
→ Ссылка
Автор решения: Фанат Арлекино

Попробуйте такое решение:

#include <iostream>
using namespace std;

int main()
{
    long long n, m, fn = 1, fm = 1, fnm = 1;
    cin >> n >> m;
    n-=1; m-=1;
    for(int i = 1; i <= n; i++){
        fn *= i;
    }
    for(int i = 1; i <= m; i++){
        fm *= i;
    }
    for(int i = 1; i <= m + n; i++){
        fnm *= i;
    }
    cout << fnm/(fn*fm);
}
→ Ссылка