ASTAR2016 ROUND2B 1003 瞬间移动

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

时间: 2024-12-29 11:14:51

ASTAR2016 ROUND2B 1003 瞬间移动的相关文章

2016"百度之星" - 初赛(Astar Round2B)1003 瞬间移动 组合数学+逆元

瞬间移动 Accepts: 1018 Submissions: 3620 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description 有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子能直接瞬移到蓝色格子),求到第nn行第mm列的格子有几种方案,答案对100000000710000000

2016百度之星总结帖

2016百度之星总结帖 测试赛 选的2015资格赛的部分题目,第二题字符串处理,第三题map计数 1001 大搬家 f f (x) = x 两次置换后回到原位 dp a->b && b->a,考虑n个数 如果它独自成对,那么就有s[n-1]: 如果它与前面某个成对,首先可以有n-1个可取,然后每个都有s[n-2]: 故s[n] = s[n-1] + (n-1)s[n-2]; 1004 放盘子 今天他向来访者们提出一个恶俗的游戏.他和来访者们轮流往一个正多边形内放盘子.最后放盘子

HDU 5698 瞬间移动 (2016"百度之星" - 初赛(Astar Round2B) 1003)

传送门 瞬间移动 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 140 Accepted Submission(s): 66 Problem Description 有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子能直接瞬移到蓝色格子),求到第n行第m列的格子有几种方案

hdu 5698 瞬间移动(2016"百度之星" - 初赛(Astar Round2B)——数学题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5698 瞬间移动 Accepts: 1018 Submissions: 3620 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description 有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子

瞬间移动(组合数, 逆元)

瞬间移动 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 263    Accepted Submission(s): 143 Problem Description 有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子能直接瞬移到蓝色格子),求到第n行第m列的格子有几

hdu5698瞬间移动(组合数,逆元)

瞬间移动 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1422    Accepted Submission(s): 684 Problem Description 有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子能直接瞬移到蓝色格子),求到第n 行第m 列的格子

1003 阶乘后面0的数量

1003 阶乘后面0的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 720,720后面有1个0. Input 一个数N(1 <= N <= 10^9) Output 输出0的数量 Input示例 5 Output示例 1其实只要循环除五就可以找到规律,其实也可以证明出来. 1 #include <iostream> 2 #include <cstdio> 3 #

BZOJ 1003: [ZJOI2006]物流运输trans

二次联通门 : BZOJ 1003: [ZJOI2006]物流运输trans /* BZOJ 1003: [ZJOI2006]物流运输trans Spfa + Dp Spfa预处理出i到j天的最小花费 然后N^2 dp即可 */ #include <cstdio> #include <iostream> #include <cstring> #include <queue> #define INF 1e6 const int BUF = 12312313;

HDU 1003 Max Sum【动态规划求最大子序列和详解 】

Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 250714    Accepted Submission(s): 59365 Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max su