1119 机器人走方格 V2

1119 机器人走方格 V2 

M * N的方格,一个机器人从左上走到右下,只能向右或向下走。有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果。
 
 

输入

第1行,2个数M,N,中间用空格隔开。(2 <= m,n <= 1000000)

输出

输出走法的数量 Mod 10^9 + 7。

输入样例

2 3

输出样例

3

这种题目暴力是不可能的,
先看题,反正走到终点需要 n + m - 2步;
其中有n - 1步要向下走,其余的向右走,
所以就是C(n + m - 2, n - 1);
然后就是求组合数了,再加上逆元。

 1 #include <bits/stdc++.h>
 2 #define N 1000000007
 3 #define ll long long int
 4 using namespace std;
 5 
 6 void exgcd(ll a,ll b,ll& d,ll& x,ll& y){
 7     if( !b ) {
 8         d = a;
 9         x = 1; 
10         y = 0; 
11     }else{ 
12         exgcd(b, a%b, d, y, x); 
13         y -= x*(a/b); 
14     }
15 }
16 
17 ll inv(ll a, ll p){
18     ll d, x, y;
19     exgcd(a, p, d, x, y);
20     return d == 1 ? (x+p)%p : -1;
21 }
22 
23 ll cc(ll m, ll n){
24     ll ans = 1;
25     ll cnt = 1;
26     for(ll i = 1; i <= m; i++){
27         ans = (ans*i)%N;
28         cnt = (cnt*n)%N;
29         n --;
30     }
31     return cnt*inv(ans, N)%N;        
32 }
33 
34 int n, m;
35 int main(){
36     cin >> n >> m;
37     cout << cc(min(n,m) - 1, n + m - 2) << endl;
38     return 0;
39 }
原文地址:https://www.cnblogs.com/zllwxm123/p/9985786.html