码迷,mamicode.com
首页 > 其他好文 > 详细

51_1118 机器人走方格(组合+乘法逆元)

时间:2016-04-19 08:47:55      阅读:457      评论:0      收藏:0      [点我收藏+]

标签:

  这道题要注意的是: 当单纯的用组合累乘的话 1000!即使long long也会溢出 , 所以只能乘一下, mod一下, 但是这样分子分母算出来后, 分子/分母 肯定就已经不是答案(因为 分子%mod / 分母%mod != ans%mod ), 此时, 就要用到乘法逆元。

  ax ≡ 1(mod m) , 则 t1 * x * t2 mod m = t1 -> t1 / t2 = t1* x mod m (将除法转换成乘法, 保证 t1/t2 的结果为 ans%mod )

  1118 机器人走方格技术分享

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
技术分享 收藏
技术分享 关注
M * N的方格,一个机器人从左上走到右下,只能向右或向下走。有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果。
Input
第1行,2个数M,N,中间用空格隔开。(2 <= m,n <= 1000)
Output
输出走法的数量。
Input示例
2 3
Output示例
3
 1     #include<iostream>
 2     #include<cstdio>
 3     using namespace std;
 4     typedef long long LL;
 5     
 6     const LL mod = 1e9 + 7;
 7     
 8     void ex_gcd(LL a, LL b, LL &d, LL &x, LL &y){
 9         if(b==0){
10             x =1; y=0 ; d = a;
11             return ;
12         }
13         ex_gcd(b, a%b, d, y, x);
14         y -= x*(a/b);
15     } 
16     
17     //乘法逆元 ax = 1(mod m) 
18     LL inverse(LL a, LL m){
19         LL x, y, d;
20         ex_gcd( a, m, d, x, y);    
21         if(d!=1)    return 0;
22         return (x%m + m)%m;
23     }
24 
25     
26     LL comb(LL m, LL n){
27         LL t1 =1, t2=1;
28         for(LL i = n-m+1 ; i<=n ; ++i)    t1 = t1*i%mod;
29         for(LL i = 1 ; i<=m ; ++i)    t2 = t2*i%mod;
30         return t1*inverse(t2, mod)%mod;
31     } 
32     
33     int main(){
34         int a, b;
35         cin>> a >> b;
36         cout<<comb(max(a-1, b-1), a+b-2)%mod<<endl;
37     } 

 

51_1118 机器人走方格(组合+乘法逆元)

标签:

原文地址:http://www.cnblogs.com/topW2W/p/5406766.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!