51Nod 1119 机器人走方格 V2
2017-12-27 18:15
387 查看
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
数据量1000的时候可以dp
动态转移方程为:dp[i][j]=(dp[i-1][j]+dp[i][j-1]),其中预处理一下dp数组第一行和第一列
当数据量为1e6的时候 机器人向下走的步数为m-1步,向右走的步数为n-1步,那么在总步数(m+n-2)中取出 m-1步,那么答案就是C(m+n-2,m-1),也可以取n-1,答案为C(m+n-2,n-1),当然都是一样的,因为C(n,m)=C(n,n-m).
因为数据量在1e6内,故求组合数的时候要逆元,可用费马小定理或者扩展GCD
V1
V2
Input
第1行,2个数M,N,中间用空格隔开。(2 <= m,n <= 1000000)
Output
输出走法的数量 Mod 10^9 + 7。
Input示例
2 3
Output示例
3
数据量1000的时候可以dp
动态转移方程为:dp[i][j]=(dp[i-1][j]+dp[i][j-1]),其中预处理一下dp数组第一行和第一列
当数据量为1e6的时候 机器人向下走的步数为m-1步,向右走的步数为n-1步,那么在总步数(m+n-2)中取出 m-1步,那么答案就是C(m+n-2,m-1),也可以取n-1,答案为C(m+n-2,n-1),当然都是一样的,因为C(n,m)=C(n,n-m).
因为数据量在1e6内,故求组合数的时候要逆元,可用费马小定理或者扩展GCD
V1
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<cmath> #include<map> #include<queue> #include<algorithm> #define max(a,b) (a>b?a:b) #define min(a,b) (a<b?a:b) #define swap(a,b) (a=a+b,b=a-b,a=a-b) using namespace std; typedef long long int LL; const int MAXL(1000); const int MAX(0x3f3f3f3f); const int mod(1e9+7); int dp[MAXL+50][MAXL+50]; int main() { ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0); int n,m; cin>>n>>m; for(int i=1;i<=m;i++) dp[1][i]=1; for(int i=1;i<=n;i++) dp[i][1]=1; for(int i=2;i<=n;i++) { for(int j=2;j<=m;j++) dp[i][j]=(dp[i-1][j]+dp[i][j-1])%mod; } cout<<dp [m]<<endl; }
V2
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<cmath> #include<map> #include<queue> #include<algorithm> #define max(a,b) (a>b?a:b) #define min(a,b) (a<b?a:b) #define swap(a,b) (a=a+b,b=a-b,a=a-b) using namespace std; typedef long long int LL; const int MAXL(1e6*2); const int MAX(0x3f3f3f3f); const LL mod(1e9+7); LL fac[MAXL*2+50]; void init() { fac[0]=fac[1]=1; for(LL i=2; i<=MAXL; i++) fac[i]=fac[i-1]*i%mod; } LL fast_pow(LL a,LL b,LL c) { LL ans=1; a=a%c; while(b) { if(b&1) ans=a*ans%c; a=a*a%c; b>>=1; } return ans%c; } LL niYuan(LL a, LL b) { return fast_pow(a, b - 2,b); } LL C(LL a, LL b) { return fac[a]*niYuan(fac[b],mod)%mod*niYuan(fac[a-b],mod)%mod; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); init(); LL n,m; cin>>n>>m; cout<<C(n+m-2,n-1)%mod<<endl; }
相关文章推荐
- 【51Nod】1119 - 机器人走方格V2(逆元 & 费马小定理 & 快速幂)
- 51nod 1119 机器人走方格 V2
- 51nod 1119 机器人走方格 V2 【组合数学】
- 51nod 1119 机器人走方格 V2 费马小定理求组合数
- 51nod 1119 机器人走方格 V2
- 51nod 1119 机器人走方格 V2
- 51nod-【1119 机器人走方格 V2】
- 51Nod - 1119 机器人机器人走方格 v2
- 51Nod 1119 机器人走方格 V2
- 51nod 1119 机器人走方格 V2 求大组合取模--逆元
- 51nod 1119 机器人走方格 V2(费马小定理+快速幂 求逆元)
- 51nod 1119 机器人走方格 V2
- 51nod 1119 机器人走方格 v2
- 51nod 1119 机器人走方格V2(求组合数,费马小定理+快速幂/逆元+gcd)
- 51Nod-1119-机器人走方格 V2
- 51nod--1119 机器人走方格 V2
- 51Nod 1119 机器人走方格 V2 组合
- 51nod 1119:机器人走方格 V2
- 51nod-1119 1119 机器人走方格 V2(组合数学+乘法逆元+快速幂)
- 51nod 1119 机器人走方格 V2 (求组合数__模板)