http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1119
基准时间限制: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 }