NWU_ACM

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

51nod 1119 机器人走方格

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

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1119

 

解法一:

 1 #include<iostream>
 2 #include<cmath>
 3 #define ll long long
 4 using namespace std;
 5 
 6 const ll mod = 1e9 + 7;
 7 
 8 //扩展欧几里得
 9 void exgcd(ll a, ll b, ll&x, ll&y) {
10     if (!b) {
11         y = 0, x = 1;
12         return;
13     }
14     exgcd(b, a%b, y, x);
15     y -= a / b*x;
16 }
17 
18 int main() {
19     ll n, m, a = 1, b = 1, x, y;
20     scanf("%lld %lld", &m, &n);
21     if (n<m)
22         swap(n, m);
23 
24     n = n + m - 2;
25     m -= 1;
26 
27     for (ll i = n, j = 0; j < m; j++, i--)
28         a = i * a % mod;
29 
30     for (ll i = 2; i <= m; i++)
31         b = b * i % mod;
32     
33     //扩展欧几里得求逆元
34     exgcd(b, mod, x, y);
35     x = (x%mod + mod) % mod;
36     //x即为b'
37 
38     printf("%lld\n", a*x%mod);
39 
40 }

 

解法二:

 1 #include<iostream>
 2 #include<cmath>
 3 #define ll long long
 4 using namespace std;
 5 
 6 const ll mod = 1e9 + 7;
 7 
 8 //快速幂
 9 ll quick_mod(ll a, ll b) {
10     ll ans = 1;
11     a %= mod;
12     while (b) {
13         if (b & 1) {
14             ans = ans * a % mod;
15             b--;
16         }
17         b >>= 1;
18         a = a * a % mod;
19     }
20     return ans;
21 }
22 
23 ll C(ll n, ll m) {
24     if (m > n) return 0;
25     ll ans = 1;
26     for (int i = 1; i <= m; i++) {
27         ll a = (n + i - m) % mod;
28         ll b = i % mod;
29         ans = ans * (a * quick_mod(b, mod - 2) % mod) % mod;
30     }
31     return ans;
32 }
33 
34 int main() {
35     ll n, m;
36     scanf("%lld %lld", &m, &n);
37     printf("%lld\n", C(n + m - 2, m - 1));
38     return 0;
39 }

 

posted on 2017-02-08 10:38  NWU_ACM  阅读(81)  评论(0)    收藏  举报