51nod 1118 机器人走方格
收起
输入
第1行,2个数M,N,中间用空格隔开。(2 <= m,n <= 1000)
输出
输出走法的数量。
输入样例
2 3
输出样例
3
动态规划代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAX 1000
#define DMAX 10000
#define MOD 1000000007
using namespace std;
typedef long long ll;
int m,n;
ll dp[MAX + ][MAX + ]; int main() {
scanf("%d%d",&m,&n);
dp[][] = ;
for(int i = ;i <= m;i ++) {
for(int j = ;j <= n;j ++) {
dp[i][j] += dp[i][j - ] + dp[i - ][j];
dp[i][j] %= MOD;
}
}
printf("%lld",dp[m][n]);
}
可以用组合数,因为在每个位置要么选择横着走,要么选择竖着走,我们发现横着跨越的边或者竖着跨越的边的数量是一定的,分别是n - 1和m - 1,所以我们只需要把横着跨越的位置选好,或者把竖着的选好,剩下的就是横着走的了。
1,1 1,2 1,3 1,4
2,1 2,2 2,3 2,4
3,1 3,2 3,3 3,4
如上,我们先把竖着跨越的选好,显然选m-1=2个,第一个选1,2->2,2吧,第二选2,4->3,4这样我们需要连接n-1=3条边,1,1->1,2,2->2,3,2,3->2,4,横的竖的只要有一个选好了,另一个就定下了,所以只需要计算其中一个选择有几种情况即可。总的需要走n+m-2步,即需要跨越这么多个格子的边界,具体把哪几步分配给横着(竖着)走,可以用组合数来完成,而这里数据大需要取模,组合数有分子分母,取模要用到逆元。
组合代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAX 1000
#define DMAX 10000
#define MOD 1000000007
using namespace std;
typedef long long ll;
int m,n;
int exgcd(int a,int b,int &x,int &y) {
if(b == ) {
x = ,y = ;
return a;
}
int g = exgcd(b,a % b,y,x);
y -= a / b * x;
return g;
}
int c(int x,int y) {
ll ans = ;
int a,b;
for(int i = y;i > y - x;i --) {
ans = (ans * i) % MOD;
}
for(int i = ;i <= x;i ++) {
exgcd(i,MOD,a,b);
a = (a + MOD) % MOD;
ans = (ans * a) % MOD;
}
return ans;
}
int main() {
scanf("%d%d",&m,&n);
printf("%d",c(min(m - ,n - ),n + m - ));
}
可以用卢卡斯定理专门求组合数。
lucas代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAX 1000000
#define DMAX 1000000
#define MOD 1000000007
using namespace std;
typedef long long ll;
int m,n;
ll pow_mod(ll a,ll b,ll p) {///quick_pow
ll ans = ;
while(b) {
if(b % ) ans = (ans * a) % p;
a = (a * a) % p;
b >>= ;
}
return ans;
}
ll c(ll a,ll b,ll p) {///c(b,a)
ll ans = ,temp = ;
for(int i = ;i < b;i ++) {
ans = (ans * (a - i)) % p;
temp = (temp * (b - i)) % p;
}
temp = pow_mod(temp,p - ,p);///变成逆元 费马定理
ans = (ans * temp) % p;
return ans;
}
ll lucas(ll a,ll b,ll p) {//main
ll ans = ;
while(a && b) {
ans = (ans * c(a % p,b % p,p)) % p;
a /= p;
b /= p;
}
return ans;
}
int main() {
scanf("%d%d",&m,&n);
printf("%d",lucas(n + m - ,n - ,MOD));
}
51nod 1118 机器人走方格的更多相关文章
- 51nod 1118 机器人走方格 解题思路:动态规划 & 1119 机器人走方格 V2 解题思路:根据杨辉三角转化问题为组合数和求逆元问题
51nod 1118 机器人走方格: 思路:这是一道简单题,很容易就看出用动态规划扫一遍就可以得到结果, 时间复杂度O(m*n).运算量1000*1000 = 1000000,很明显不会超时. 递推式 ...
- (DP)51NOD 1118 机器人走方格
M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果. Input 第1行,2个数M,N,中间用空格隔开.( ...
- 51nod 1118 机器人走方格【dp】
M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果. 收起 输入 第1行,2个数M,N,中间用空格隔开.( ...
- 51Nod 1118 机器人走方格--求逆元
(x/y) %mod =x*(y^(mod-2))%mod; 在算x,y的时候可以一直mod 来缩小 y^(mod-2)显然是个快速幂 #include <iostream> #inclu ...
- 51nod 1119 机器人走方格 V2
1119 机器人走方格 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少 ...
- 51nod 1120 机器人走方格V3
1120 机器人走方格 V3 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 N * N的方格,从左上到右下画一条线.一个机器人从左上走到右下,只 ...
- 51Nod——N1118 机器人走方格
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1118 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 ...
- 51nod 1120 机器人走方格 V3 卡特兰数 lucas定理
N * N的方格,从左上到右下画一条线.一个机器人从左上走到右下,只能向右或向下走.并要求只能在这条线的上面或下面走,不能穿越这条线,有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 100 ...
- 51nod 1120 机器人走方格 V3
N * N的方格,从左上到右下画一条线.一个机器人从左上走到右下,只能向右或向下走. 并要求只能在这条线的上面或下面走,不能穿越这条线,有多少种不同的走法? 由于方法数量可能很大,只需要输出Mod 1 ...
随机推荐
- VS2012 创建 WebService
1.文件——新建——项目——Visual C#——Web——ASP.NET 空 Web 应用程序. 2.右键项目——添加——新建项——Web——Web 服务. 3.按 F5 启动调试,浏览器将显示接口 ...
- IE与DOM的事件监听
IE 事件监听 标准DOM不支持 注意几点: window.onload attachEvent detachEvent 标准DOM监听,ie不支持
- JS的scrollIntoView
scrollIntoView(alignWithTop) 滚动浏览器窗口或容器元素,以便在当前视窗的可见范围看见当前元素.如果alignWithTop为true,或者省略它,窗口会尽可能滚动到自身顶 ...
- JS实现的base64加密、md5加密及sha1加密详解
1.base64加密 在页面中引入base64.js文件,调用方法为: <!DOCTYPE HTML> <html> <head> <meta charset ...
- 我的Ansible学习笔记
Ansible常见错误 http://afewbug.com/article/26官方文档 http://docs.ansible.com/ansible/安装配置 http://sofar.blog ...
- 关于Spring中applicationContext.xml配置错误“org/springframework/transaction/interceptor/TransactionInterceptor”的问题解决
问题描述: 在配置spring的applicationContext.xml中的默认事务管理器的时候可能会出现这样的错误: Error occured processing XML 'org/spri ...
- w3c标准盒模型与IE传统模型的区别
一.盒子模型(box model) 在HTML文档中的每个元素被描绘为矩形盒子.确定其大小,属性——比如颜色.背景.边框,及其位置是渲染引擎的目标. CSS下这些矩形盒子由标准盒模型描述.这个模型描述 ...
- 设计模式--策略模式C++实现
策略模式C++实现 1定义 (Strategy Pattern)定义一组算法,将每个算法都封装起来,并且使他们可以相互替换 也叫政策模式 2类图 3实现 class Strategy{ protect ...
- program发展史及以后预测
三个阶段:第一个阶段是1950年代到1960年代,是程序设计阶段,基本是个体手工劳动的生产方式.这个时期,一个程序是为一个特定的目的而编制的,软件的通用性是很有限的,软件往往带有强烈的个人色彩.早期的 ...
- Seaborn-05-Pairplot多变量图
转自:http://www.jianshu.com/p/6e18d21a4cad