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 }
浙公网安备 33010602011771号