码迷,mamicode.com
首页 > 移动开发 > 详细

ASTAR2016 ROUND2B 1003 瞬间移动

时间:2016-05-22 22:50:23      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:

http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=702&pid=1003

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)。

ASTAR2016 ROUND2B 1003 瞬间移动

标签:

原文地址:http://www.cnblogs.com/gu-castle/p/5517843.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!