Помогите с задачей с++
Количество маршрутов в прямоугольной таблице В прямоугольной таблице 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
→ Ссылка
- Если введут m < n, то все "накроется медным тазом". Потому что m-n < 0, а фактрориал уйдет в беск. рекурсию.
- Лучше избегать рекурсии там, где это возможно
#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);
}