M * N的方格,一个机器人从左上走到右下,只能向右或向下走。有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果。
收起
输入
第1行,2个数M,N,中间用空格隔开。(2 <= m,n <= 1000000)
输出
输出走法的数量 Mod 10^9 + 7。
输入样例
2 3
输出样例
3
思路:这个题目的话,我们可以想象成是这样:现在我们需要向下走N-1步,向右走M-1步,然后我们现在的话,需要确定这些步,也就是在n-1+m-1步中取出n-1步来向右走,其余的也就只能是向下走了,所以我们应该对于前面数据做组合数处理,
题中给出的我们要对1e9+7做mod处理,配合逆元就可以了,
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#define ll long long
using namespace std;
const ll mod=1e9+7;
ll pow(ll a,ll i)
{
ll ans=1;
while(i)
{
if(i&1)
ans=ans*a%mod;
i>>=1;
a=a*a%mod;
}
return ans;
}
ll jc(ll n)
{
ll ans=1;
for(ll i=1;i<=n;i++)
ans=ans*i%mod;
return ans;
}
ll C(ll n,ll m)
{
ll ans=1;
ans=ans*jc(n)%mod;
ans=ans*pow(jc(m),mod-2)%mod;
ans=ans*pow(jc(n-m),mod-2)%mod;
return ans;
}
int main()
{
int m,n;
cin>>n>>m;
cout<<C(m-1+n-1,n-1)<<endl;
return 0;
}