1119 机器人走方格 V2
基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题
M * N的方格,一个机器人从左上走到右下,只能向右或向下走。有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果。
Input
第1行,2个数M,N,中间用空格隔开。(2 <= m,n <= 1000000)
Output
输出走法的数量 Mod 10^9 + 7。
Input示例
2 3
Output示例
3
组合数学求一个C(m,n),需要求一个逆元,用ex_gcd();
吧。
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
#define endl "\n"
const int maxn=1000000+100;
const int MOD=1e9+7;
long long Fac(int x){
long long sum=1;
for(int i=1;i<=x;i++){
sum=(sum*i)%MOD;
}
return sum;
}
void ex_gcd(long long a,long long b,long long &x,long long &y){
if(!b){
x=1;
y=0;
return;
}
ex_gcd(b,a%b,y,x);
y-=x*(a/b);
}
long long C(int n,int m){
long long a=Fac(m)*Fac(n-m)%MOD;
long long b=MOD;
long long x;
long long y;
ex_gcd(a,b,x,y);
return ((Fac(n)*x)%MOD+MOD)%MOD;
}
int main (){
int n,m;
cin>>n>>m;
cout<<C(n+m-2,n-1)<<endl;
return 0;
}