您的位置:首页 > 其它

ASTAR2016 ROUND2B 1003 瞬间移动

2016-05-22 21:26 253 查看
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)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: