标签:ace ack log 机器人 51nod text name end www
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1119
第1行,2个数M,N,中间用空格隔开。(2 <= m,n <= 1000000)
输出走法的数量 Mod 10^9 + 7。
2 3
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 }
标签:ace ack log 机器人 51nod text name end www
原文地址:http://www.cnblogs.com/zzqc/p/7380408.html