ASTAR2016 ROUND2B 1003 瞬间移动
2016-05-22 21:26
253 查看
http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=702&pid=1003
两个整数n,m(2≤n,m≤100000)。
枚举 r 取 1 到 min(n-1, m-1),就可以通过这道题。
如果换个角度考虑的话,还可以更容易,先列出前面 5 行 5 列的方案数的表:
1 0 0 0 0
0 1 1 1 1
0 1 2 3 4
0 1 3 6 10
0 1 4 10 20
我们容易推知:
但是这样计算不便,我们考虑一下简化,f(n, m) = f(n-1,m) + f(n,m-1) + f(n-1,m-1) - T。我们用 T 表示 f(n-1,m) 和 f(n,m-1) 的重复部分。不难看出这个重复部分就是 f(n-1,m-1),所以我们有 f(n, m) = f(n-1,m) + f(n,m-1)。
发现了这一点,就可以明白,答案就是从 (2,2) 到 (n, m) 的“不后退路径”数,也就是 C(n-2 + m-2, n-2)。
Problem Description
有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子(严格在当前位置的右下),并瞬移过去,求到第n行第m列的格子有几种方案,答案对1000000007取模。Input
多组测试数据。两个整数n,m(2≤n,m≤100000)。
Sample Input
4 5
Sample Output
10
Solution
假设一共移动了 r 步,第 i 步横向走了 x[i],纵向走了 y[i],那么就有 x[1] + ... + x[r] = m-1; y[1] + ... + y[r] = n-1。只要计算这样的数组有多少就可以了,考查一个数 s 划分为 r 个可以相同的正整数,利用插板的模型可以发现划分数是 C(s-1, r-1)。那么对于当前的 r,一共的路径数目就是 C(n-2, r-1) * C(m-2, r-1)。枚举 r 取 1 到 min(n-1, m-1),就可以通过这道题。
如果换个角度考虑的话,还可以更容易,先列出前面 5 行 5 列的方案数的表:
1 0 0 0 0
0 1 1 1 1
0 1 2 3 4
0 1 3 6 10
0 1 4 10 20
我们容易推知:
但是这样计算不便,我们考虑一下简化,f(n, m) = f(n-1,m) + f(n,m-1) + f(n-1,m-1) - T。我们用 T 表示 f(n-1,m) 和 f(n,m-1) 的重复部分。不难看出这个重复部分就是 f(n-1,m-1),所以我们有 f(n, m) = f(n-1,m) + f(n,m-1)。
发现了这一点,就可以明白,答案就是从 (2,2) 到 (n, m) 的“不后退路径”数,也就是 C(n-2 + m-2, n-2)。
相关文章推荐
- assets目录和res/raw目录的区别
- HTML---网页编程基础知识
- MySQL索引背后的之使用策略及优化
- [致敬陈景润]几个基础数论问题证明
- 【HDU 1575】Tr A (矩阵快速幂)
- 【php】json对象解码为array数组
- 现代密码学应用的范例-PGP
- 函数统计输入字符串中字母,数字等个数。
- 在ie8上js实现简单的combobox功能(支持拼音检索)
- Spark函数讲解序列文章
- Redis在Centos7上的安装部署
- Java SE 回顾(一) 数据类型&异或
- Eclipse中使用JDBC连接MYSQL数据库
- iOS开发之理解iOS中的MVC设计模式
- Python Socket 网络编程
- Array常用功能扩展.js
- (四)洞悉linux下的Netfilter&iptables:包过滤子系统iptable_filter
- 快速掌握Lua 5.3 —— 资源管理
- 【2016杭电女生赛1002】【排列组合 隔板法】Desert 对n做正整序列拆分的方案数
- 面试小技巧 get