51nod 1119 组合数,逆元

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1119

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
一个很经典的题目,最开始做是用dp推导,但是当数据很大的时候就不行了,考虑用组合的概念解题;
N*M的棋盘,左上到右下只能向右下方走,这就固定了行走步数,也就是N+M-2步,其中N-1步是向下走的,M-1步是向右走的,问题就相当于从总步数中挑选N-1步向下走,其他的位置就是向右。
也就是C(N-1,N+M-2), C(n,r)=(n-r+1)/r*C(n,r-1) ,利用逆元求解。
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define LL long long
 4 LL mod=1e9+7;
 5 LL inv[1000005]={1,1};
 6 int main()
 7 {
 8     LL N,M;
 9     for(LL i=2;i<=1000000;++i)
10         inv[i]=(mod-mod/i)*inv[mod%i]%mod;
11     cin>>M>>N;
12     LL ans=1,n=N+M-2;
13     for(LL i=1;i<=N-1;++i)
14         ans=(n-i+1)*inv[i]%mod*ans%mod;
15     cout<<ans<<endl;
16     return 0;
17 }

 

posted @ 2017-08-17 10:48  *zzq  阅读(173)  评论(0编辑  收藏  举报