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 ...
随机推荐
- POJ3768 Katu Puzzle
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- Springboot依赖注入笔记
结合Autowired和Service注解 public interface IUser { void say(); } @Service public class Student implement ...
- Memcached flush_all 命令
Memcached flush_all 命令用于用于清理缓存中的所有 key=>value(键=>值) 对. 该命令提供了一个可选参数 time,用于在制定的时间后执行清理缓存操作. 语法 ...
- 淘汰算法 LRU、LFU和FIFO
含义: FIFO:First In First Out,先进先出LRU:Least Recently Used,最近最少使用 LFU:Least Frequently Used,最不经常使用 以上三者 ...
- Android ---------高德卫星地图绘制多个点和点的点击事件自定义弹窗
最近开发中,遇到一个多个点绘制,并实现点击事件,出现自定义窗口显示相关信息等功能,所以写了这篇博客. 从后台请求数据,得到多个经纬度,然后绘制在地图上,并实现点击,出现相关信息(自定义弹框实现) 先来 ...
- 创建一个最简单的SpringBoot应用
已经来实习了一段时间了,从开始接触到SpringBoot框架到现在一直都感觉SpringBoot框架实在是为我们带来了巨大遍历之处,之前一直在用并没有总结一下,现在有空从零开始写点东西,也算是对基础的 ...
- 十七 Python分布式爬虫打造搜索引擎Scrapy精讲—深度优先与广度优先原理
网站树形结构 深度优先 是从左到右深度进行爬取的,以深度为准则从左到右的执行(递归方式实现)Scrapy默认是深度优先的 广度优先 是以层级来执行的,(列队方式实现)
- OGNL表达式语言中的"#"和"$"的区别
Struts2使用标准的Context来进行OGNL表达式语言求值,OGNL的顶级对象是一个Context,这个Context对象就是一个Map类型实例,其根对象就是ValueStack,如果需要访问 ...
- 使用C++为对象分配与释放内存时的几个好习惯
本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/ 最近在为公司的项目写内存泄漏定位工具,遇到一些关于C++构造与析构对象的问题,在此记录一下 ...
- 转:kafka入门
一.基本概念 介绍 Kafka是一个分布式的.可分区的.可复制的消息系统.它提供了普通消息系统的功能,但具有自己独特的设计. 这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统术语:Kafk ...