1120 机器人走方格 V3 

基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题

 收藏

 关注

N * N的方格,从左上到右下画一条线。一个机器人从左上走到右下,只能向右或向下走。并要求只能在这条线的上面或下面走,不能穿越这条线,有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10007的结果。

Input

输入一个数N(2 <= N <= 10^9)。

Output

输出走法的数量 Mod 10007。

Input示例

4

Output示例

10

#include<bits/stdc++.h>

#define MOD 10007

using namespace std;

typedef long long ll;

ll inv(ll t, ll p)

{//求t关于p的逆元,注意:t要小于p,最好传参前先把t%p一下

    return t == 1 ? 1 : (p - p / t) * inv(p % t, p) % p;

}

ll f[MOD+3];

void init(int p)

{       //f[n] = n!

    f[0] = 1;

    for (int i=1; i<=p; ++i) f[i] = f[i-1] * i % p;

}

ll pow_mod(ll a, ll x, int p)

{

    ll ret = 1;

    while (x)

        {

        if (x & 1)  ret = ret * a % p;

        a = a * a % p;

        x >>= 1;

    }

    return ret;

}

ll Lucas(ll n, ll k, int p)        //C (n, k) % p

{

     ll ret = 1;

     while (n && k)

        {

        ll nn = n % p, kk = k % p;

        if (nn < kk) return 0;  //inv (f[kk]) = f[kk] ^ (p - 2) % p

        ret = ret * f[nn] * pow_mod (f[kk] * f[nn-kk] % p, p - 2, p) % p;

        n /= p, k /= p;

     }

     return ret;

}

int main(void)

{

    init (10007);

    ll n;

    cin>>n;

    n--;

    ll ans=Lucas(2*n,n,MOD);

    ll temp=(n+1)%MOD;//使用inv函数前%一下

    ans=(ans*inv(temp,MOD))%MOD;

    ans=(ans*2)%MOD;

    cout<<ans<<endl;

    return 0;

}

51nod 1120 机器人走方格V3的更多相关文章

  1. 51nod 1120 机器人走方格 V3 卡特兰数 lucas定理

    N * N的方格,从左上到右下画一条线.一个机器人从左上走到右下,只能向右或向下走.并要求只能在这条线的上面或下面走,不能穿越这条线,有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 100 ...

  2. 51nod 1120 机器人走方格 V3

    N * N的方格,从左上到右下画一条线.一个机器人从左上走到右下,只能向右或向下走. 并要求只能在这条线的上面或下面走,不能穿越这条线,有多少种不同的走法? 由于方法数量可能很大,只需要输出Mod 1 ...

  3. 51nod 1120 机器人走方格 V3 【卡特兰数+卢卡斯定理+组合数】

    -我并不知道为什么事卡特兰数,反正用dp打的表就是卡特兰数,因为是两个三角所以再乘个2 卡特兰数使用\( h(n)=\frac{C_{2n}^{n}}{n+1} \)因为范围比较大所以组合数部分用卢卡 ...

  4. 1120 机器人走方格 V3

    1120 机器人走方格 V3 基准时间限制:1 秒 空间限制:131072 KB N * N的方格,从左上到右下画一条线.一个机器人从左上走到右下,只能向右或向下走.并要求只能在这条线的上面或下面走, ...

  5. 1120 机器人走方格 V3(组合数)

    题目实际上是求catalan数的,Catalan[n] = C(2*n,n) / (n+1) = C(2*n,n) % mod * inv[n+1],inv[n+1]为n+1的逆元,根据费马小定理,可 ...

  6. 机器人走方格 V3

    1120 . 机器人走方格 V3   基准时间限制:1 秒 空间限制:65536 KB 分值: 160 N * N的方格,从左上到右下画一条线.一个机器人从左上走到右下,只能向右或向下走.并要求只能在 ...

  7. 51nod1120 机器人走方格 V3

    跟括号序列是一样的,将向右走看成是左括号向左走看成是右括号就可以了.那么就是卡特兰数了.然后由于n和m太大所以用了lucas定理 //跟括号序列是一样的,将向右走看成是左括号向左走看成是右括号就可以了 ...

  8. 51nod 1118 机器人走方格 解题思路:动态规划 & 1119 机器人走方格 V2 解题思路:根据杨辉三角转化问题为组合数和求逆元问题

    51nod 1118 机器人走方格: 思路:这是一道简单题,很容易就看出用动态规划扫一遍就可以得到结果, 时间复杂度O(m*n).运算量1000*1000 = 1000000,很明显不会超时. 递推式 ...

  9. 51nod 1119 机器人走方格 V2

    1119 机器人走方格 V2  基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少 ...

随机推荐

  1. Linux学习笔记(15)Linux字符集(locale,LANG,LC_ALL)

    关键词:linux系统修改编码,linux字符集问题, 目录  零.什么是locale 一.locale的详细内容 二.理解locale的设置 三 具体设定locale的方法(zh_CN.UTF-8. ...

  2. Mybatis数据基本操作

    <insert id="doCreate" parameterType="News"><!--添加数据--> INSERT INTO n ...

  3. 深入理解分布式系统的2PC和3PC

    协调者 在分布式系统中,每一个机器节点虽然都能明确的知道自己执行的事务是成功还是失败,但是却无法知道其他分布式节点的事务执行情况.因此,当一个事务要跨越多个分布式节点的时候(比如,淘宝下单流程,下单系 ...

  4. 虚拟机上安装Linux系统之ubuntu

    以前自己在虚拟机上安装过几回Linux系统,有centos.ubuntu,不过都没来得及写一个安装教程,今天正好需要重新安装一下,就分享一个安装ubuntu的详细教程 安装前准备: VMWare虚拟机 ...

  5. Hive 教程(四)-分区表与分桶表

    在 hive 中分区表是很常用的,分桶表可能没那么常用,本文主讲分区表. 概念 分区表 在 hive 中,表是可以分区的,hive 表的每个区其实是对应 hdfs 上的一个文件夹: 可以通过多层文件夹 ...

  6. Ansible 系统概述与部署

    Ansible 系统概述 Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具.它用Python写成,类似于saltstack和Puppet但是有一个不同和优点是我们不需要在节点中安装 ...

  7. JavaSSM框架精选50道面试题

    JavaSSM框架精选50道面试题 2019年02月13日 19:04:43 EerhtSedah 阅读数 7760更多 分类专栏: 面试题   版权声明:本文为博主原创文章,遵循CC 4.0 BY- ...

  8. 导出excel模版

    方法一: public void ToExcel(){ //第一步:获取模版物理路径 string file_1 = Server.MapPath("/Content/Excel/downE ...

  9. Kong/Konga - Docker容器化安装

    1.0 安装kong + postgresDB docker network create kong-net docker pull postgres:latest docker run -d --n ...

  10. maven学习之路三

    我们在写代码的时候,有些项目会有重复代码,或者是重复项目结构,这样我们就可以用maven 生成一个项目的基本骨架,就像我之前介绍的哪个logindemo一样继承了webApp-achetype一样.我 ...