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

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

Input

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

Output

输出走法的数量 Mod 10007。

Input示例

4

Output示例

10

明显是一道卡特兰数,推出ans = C(2*n-2,n-1) * 2 / n % MOD先让n--,ans = C(2*n,n) * 2 / (n+1) % MOD 这样公式看起来好看些

由于 n <= 10^9,但是 MOD = 10007,所以求ans需要用到lucas定理
  //File Name: nod1120.cpp
  //Author: long
  //Mail: [email protected]
  //Created Time: 2016年05月27日 星期五 15时46分58秒

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>

#define LL long long

using namespace std;

const int MOD = 10007;

LL jie[MOD];

LL qp(LL x,LL y){
    LL res = 1;
    while(y){
        if(y & 1) res = res * x % MOD;
        x = x * x % MOD;
        y >>= 1;
    }
    return res;
}

void init(){
    jie[0] = 1;
    for(int i=1;i<MOD;i++)
        jie[i] = jie[i-1] * i % MOD;
}

LL get_c(int x,int y){
    if(y == 0 || y == x) return 1;
    return jie[x] * qp(jie[y] * jie[x-y] % MOD,MOD - 2) % MOD;
}

LL lucas(LL x,LL y){
    LL ans = 1;
    int u,v;
    while(x > 0 || y > 0){
        u = x % MOD;
        v = y % MOD;
        ans = ans * get_c(u,v) % MOD;
        x /= MOD;
        y /= MOD;
    }
    return ans;
}

int main(){
    init();
    int n;
    while(~scanf("%d",&n)){
        n--;
        printf("%d\n",(int)lucas(2*n,n) * qp(n+1,MOD-2) * 2 % MOD);
    }
    return 0;
}
				
时间: 2024-10-09 10:21:18

51nod 1120 机器人走方格 V3 卡特兰数 lucas定理的相关文章

51NOD 1120 机器人走方格 V3(卢卡斯定理 + 非降路径)

传送门 N * N的方格,从左上到右下画一条线.一个机器人从左上走到右下,只能向右或向下走.并要求只能在这条线的上面或下面走,不能穿越这条线,有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10007的结果. Input 输入一个数N(2 <= N <= 10^9). Output 输出走法的数量 Mod 10007. Input示例 4 Output示例 10 解题思路: 从左上做到右下只能向右护着向下走,就是相当于从左下走到右上的一条非降路径,然后中间加了一些障碍,其实就是从(

1120 机器人走方格 V3

1120 机器人走方格 V3 基准时间限制:1 秒 空间限制:131072 KB N * N的方格,从左上到右下画一条线.一个机器人从左上走到右下,只能向右或向下走.并要求只能在这条线的上面或下面走,不能穿越这条线,有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10007的结果. Input 输入一个数N(2 <= N <= 10^9). Output 输出走法的数量 Mod 10007. Input示例 4 Output示例 10 思路:这个在对角线的上方,就可以转换为,火车进

机器人走方格 V3

1120 . 机器人走方格 V3 基准时间限制:1 秒 空间限制:65536 KB 分值: 160 N * N的方格,从左上到右下画一条线.一个机器人从左上走到右下,只能向右或向下走.并要求只能在这条线的上面或下面走,不能穿越这条线,有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10007的结果. Input输入一个数N(2 <= N <= 10^9). Output输出走法的数量 Mod 10007. Input 示例4 Output 示例10思路:实际是本质就是,n个0,n个

51Nod1120 机器人走方格 V3

题目 N * N的方格,从左上到右下画一条线.一个机器人从左上走到右下,只能向右或向下走.并要求只能在这条线的上面或下面走,不能穿越这条线,有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10007的结果. N<=1e9 思路 卡特兰数+卢卡斯定理+乘法逆元算组合数 卡特兰数:某百科卡特兰数词条讲过这种情况. 卢卡斯定理:组合数,模数很小,逐次拆分 乘法逆元,见前面,此处n+1不能保证和p互质,建议用卡特兰数两组合数相减的公式.(不过数据很弱我写的/(n+1)) 代码 #includ

51nod 1118 机器人走方格 (小数据用dp)

1118 机器人走方格 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 取消关注 M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果. Input 第1行,2个数M,N,中间用空格隔开.(2 <= m,n <= 1000) Output 输出走法的数量. Input示例 2 3 Output示例 3 设dp[i][j]表示走到第i行第j列有多少种走法.状态转移

51nod 1119 机器人走方格 V2 (组合数学+逆元)

1119 机器人走方格 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 取消关注 M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果. Input 第1行,2个数M,N,中间用空格隔开.(2 <= m,n <= 1000000) Output 输出走法的数量 Mod 10^9 + 7. Input示例 2 3 Output示例 3 分析:因为只能向

51Nod——N1118 机器人走方格

https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1118 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果. Input 第1行,2个数M,N,中间用空格隔开.(2 <= m,n <= 1000) Output 输出走法的数量.

51nod 1118 机器人走方格

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果. Input 第1行,2个数M,N,中间用空格隔开.(2 <= m,n <= 1000) Output 输出走法的数量. Input示例 2 3 Output示例 3 棋盘dp屠龙宝刀点击就送 #include <cstdio> int dp[1001][100

(DP)51NOD 1118 机器人走方格

M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果. Input 第1行,2个数M,N,中间用空格隔开.(2 <= m,n <= 1000) Output 输出走法的数量. Input示例 2 3 Output示例 3解:简单dp,注意空间复杂度的优化. 1 #include <stdio.h> 2 3 #define MOD ((int)1e9+7) 4 5 int dp[1005] =