您的位置:首页 > 其它

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

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: