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