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

51nod 1119 组合数,逆元

时间:2017-08-17 12:40:46      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:ace   ack   log   机器人   51nod   text   name   end   www   

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 }

 

51nod 1119 组合数,逆元

标签:ace   ack   log   机器人   51nod   text   name   end   www   

原文地址:http://www.cnblogs.com/zzqc/p/7380408.html

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