ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数学-满足条件的01序列-卡特兰数

2022-07-27 23:01:37  阅读:125  来源: 互联网

标签:满足条件 01 int res LL 序列 2n include 卡特兰


C++

AcWing 889. 满足条件的01序列

/*
 *  问题描述:
 *      给定 n 个 0 和 n 个 1,它们将按照某种顺序排成长度为 2n 的序列,
 *      求它们能排列成的所有序列中,能够满足任意前缀序列中 0 的个数都不少于 1 的个数的序列有多少个。
 *      输出的答案对 109+7 取模。
 *      输入格式
 *      共一行,包含整数 n。
 *      输出格式
 *      共一行,包含一个整数,表示答案。
 *      数据范围
 *      1 ≤ n ≤ 10 ^ 5
 *
 *  解题思路:
 *      典型卡特兰数,
 *      组合数表示为:
 *          C(2n, n) - C(2n, n - 1)
 *              = C(2n, n - 1) / n
 *              = C(2n, n) / (n + 1)
 *      证明可以通过画图, y = x + 1 的对偶性来判断
 *          总方案为 C(2n, n)
 *          不合法方案为 C(2n, n - 1): 对偶得到
 *          因此,合法方案为 C(2n, n) - C(2n, n - 1)
 *
 */
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

typedef long long LL;
const int MOD = 1e9 + 7;

LL qmi(LL a, LL b, LL mod) {
    LL res = 1;
    while (b) {
        if (b & 1) {
            res = res * a  % mod;
        }
        b >>= 1;
        a = a * a % mod;
    }
    return res;
}

LL solution(int n) {
    // C(2n, n)
    LL res = 1;
    for (int i = 2 * n; i >= n + 1; i -- ) {
        res = res * i % MOD;
    }

    for (int i = 2; i <= n; i ++ ) {
        res = res * qmi(i, MOD - 2, MOD) % MOD;
    }

    res = res * qmi(n + 1, MOD - 2, MOD) % MOD;
    return res;
}

int main()
{
    int n;
    scanf("%d", &n);
    printf("%lld\n", solution(n));

    return 0;
}


标签:满足条件,01,int,res,LL,序列,2n,include,卡特兰
来源: https://www.cnblogs.com/lucky-light/p/16526891.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有