您的位置:首页 > 其它

计蒜课 蒜头君走迷宫

2017-03-23 10:25 141 查看

问题

蒜头君从一个 n 行 m 列的迷宫的左上角走到右下角,蒜头君每次只能向下或者向右走一步,蒜头君想知道他有多少种走法。

输入格式

输入 2 个整数 n(1≤n≤3),m(2≤m≤10​^9​)。

输出格式

输出方案数。

样例输入1

2 3

样例输出1

3

样例输入2

3 3

样例输出2

6

思路

在看到m的数据达到10^9的时候,可以发现用dfs做肯定超时,用数组存数据肯定内存不够,因此我们得想别的方法解决这个问题,此题我是用排列组合做的,我们可以发现无论怎么走到终点,总步数是一致的,既向下走 n-1 步 ,向右走 m-1 步,一共走了 n+m-2 步,因此样例1 输入2 3的方案数为Cn+m-2(n-1)也就是C3(1)=3,因为虽然是 2 , 3 个格子,但是每个方向只需要走 1 , 2 步,总共为3

我又发现Cmn=n!m!(n−m)!=n∗(n−1)...∗(n−m+1)m! 所以可以简化为如下代码===>>>

代码

#include <iostream>
using namespace std;
long long factorial(int n)//求阶乘
{
int sum=1;
for (int i=1;i<=n;i++) {
sum*=i;
}
return sum;
}
int main() {
long long m;
int n;
scanf("%d%lld",&n,&m);
long long x=1;
for (int i=n+m-2;i>n+m-2-n+1;i--) {
x*=i;
}
long long total=x/factorial(n-1);
printf("%lld",total);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: