51nod 2级算法题-1119

来源:互联网 发布:vb取整函数函数 编辑:程序博客网 时间:2024/06/11 04:02

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;}
0 0