关闭

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

标签: 组合数学
4580人阅读 评论(4) 收藏 举报
分类:

传送门
瞬间移动

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列的格子有几种方案,答案对1000000007取模。

http://acm.hdu.edu.cn/data/images/C702-1003-1.jpg

Input
多组测试数据。

两个整数n,m(2≤n,m≤100000)

Output
一个整数表示答案

Sample Input
4 5

Sample Output
10

Source
2016”百度之星” - 初赛(Astar Round2B)

解题思路:
首先我们分析一下这个题其实就是我们要从(1, 1)点走到(n, m)点,而且只能走右下方,那么我们就相当于从(n+m-4)个格子里选n-2(或者是m-2)个格子,因为我们得去掉n-1行和m-1列(这个不能选),然后再去掉第一行和第一列,所以就是

C(m+n4,n+2)=(n+m4)!(n2)!(m2)!

因为这个数要对MOD取余,那么我们需要求一下(n-2)!*(m-2)!关于MOD的逆元,这个其实一个循环就行,每次扩展欧几里得一下,就OK了,最后就是编码了,
第一步:写一个扩展欧几里得算法,求a关于b的逆元;
第二步:根据公式,一步步的求,先求(n+m-4)!模上MOD,然后再for循环求两个阶乘的逆元
第三步:输出结果。

上代码:

#include <iostream>
using namespace std;
typedef long long LL;
const LL MOD = 1000000007;
void exgcd(LL a, LL b, LL &x, LL &y)
{
    if(b == 0)
    {
        x = 1;
        y = 0;
        return;
    }
    LL x1, y1;
    exgcd(b, a%b, x1, y1);
    x = y1;
    y = x1-(a/b)*y1;
}
int main()
{
    LL n, m;
    while(cin>>n>>m)
    {
        LL ans = 1;
        for(LL i=1; i<=n+m-4; i++)
            ans = (ans*i)%MOD;
        for(LL i=1; i<=n-2; i++)
        {
            LL x, y;
            exgcd(i, MOD, x, y);
            x = (x%MOD+MOD)%MOD;
            ans = (ans*x)%MOD;
        }
        for(LL i=1; i<=m-2; i++)
        {
             LL x, y;
            exgcd(i, MOD, x, y);
            x = (x%MOD+MOD)%MOD;
            ans = (ans*x)%MOD;
        }
        ans = (ans%MOD+MOD)%MOD;
        cout<<ans<<endl;
    }
    return 0;
}
2
0
查看评论

hdu5698 瞬间移动(组合数取摸)(16百度之星round2B)

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Description 有一个无限大的矩形,初始时你在左上角(即...
  • chat_c
  • chat_c
  • 2016-05-22 23:00
  • 715

HDU 5698

得到组合公式: C(m+n-4,n-2)或者是 C(m+n-4,m-2); 其中m+n-4表示是从m-2+n-2行和列的和中,选m-2列出来走(其中行也在走);或者说是 选n-2行出来走(其中列也在走); 求逆元: 利用扩展欧几里得算法; #include using names...
  • MyHeaven7
  • MyHeaven7
  • 2016-08-07 16:10
  • 158

hdu 5698 组合数

瞬间移动 Problem Description 有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子能直接瞬移到蓝色格子),求到第nn行第mm列的格子有几种方案,答案对1000000007100000000...
  • hjt_fathomless
  • hjt_fathomless
  • 2016-05-23 17:42
  • 435

百度之星2016初赛(第二场) -- Astar Round2B

1003  签到题,其实就是输出一个取模后的组合数,需要用到乘法逆元。#include <iostream> #include <stdio.h> #include <cmath> #include <algorithm> ...
  • squee_spoon
  • squee_spoon
  • 2016-05-22 20:14
  • 450

2016"百度之星" - 初赛(Astar Round2B)解题报告

2016"百度之星" - 初赛(Astar Round2B)解题报告
  • queuelovestack
  • queuelovestack
  • 2016-05-22 19:37
  • 1933

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5698 题意说我们可以从一个格子跳到右下角的任意一个格子中,那么反过来,跳到某一个格子的方法数显然就是其左上角的所有格子的方法数的和,那么问题又来了,我们怎么才能求出一个格子左上角的所有的格子的方法数和...
  • RaAlGhul
  • RaAlGhul
  • 2016-05-23 19:38
  • 520

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5698 瞬间移动    Accepts: 1018    Submissions: 3620  Time Limit: 400...
  • qiqi_skystar
  • qiqi_skystar
  • 2016-05-23 18:42
  • 4135

HDU 5698 瞬间移动(百度之星2016)

2016暑期集训2-JHDU 5698 瞬间移动(百度之星2016)想法+组合取模 传送门:HustOJ 传送门:HDU 题意中文的,有图,开源网页吧。思路m行n列,每次至少往右走一步、往下走一步,所以一共往右走n-1格,往下走m-1格。所以最多走min(m-1,n-1)次。往右走往下走的...
  • xzxxzx401
  • xzxxzx401
  • 2016-07-20 22:21
  • 230

2016"百度之星" - 初赛(Astar Round2B)1006

中位数计数转载声明:http://blog.csdn.net/jtjy568805874/article/details/51477656 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5701个人想法:这次是我第一次写得博客,在平时我几乎没写过博客...
  • zzz805
  • zzz805
  • 2016-05-23 18:15
  • 267

2016"百度之星" - 初赛(Astar Round2B)题解

1001我们定义“区间的价值”为一段区间的最大值*最小值。一个区间左端点在LL,右端点在RR,那么该区间的长度为(R-L+1)(R−L+1)。我们想要知道的是,对于长度为1-n的区间,最大价值的区间价值分别是多少。 要输出n种长度的区间的解,所以暴力是肯定不行的。我们要考虑到几个性质。 1.小区...
  • Miracle_ma
  • Miracle_ma
  • 2016-05-23 10:52
  • 929
    个人资料
    • 访问:529267次
    • 积分:11554
    • 等级:
    • 排名:第1585名
    • 原创:639篇
    • 转载:5篇
    • 译文:0篇
    • 评论:93条
    博客专栏