满足条件的01序列(大厂机考题)

简介: 满足条件的01序列(大厂机考题)

给定 n个 0 和 n个 1,它们将按照某种顺序排成长度为 2n的序列,求它们能排列成的所有序列中,能够满足任意前缀序列中 0的个数都不少于 1的个数的序列有多少个。


输出的答案对 1e9+7取模。


输入格式

共一行,包含整数 n。


输出格式

共一行,包含一个整数,表示答案。


数据范围

1≤n≤1e5

输入样例:
3
输出样例:
5

思路:

将01排序问题转化为卡特兰数问题,先给出公式:

01排序相当于在下图从(0,0)走到(6,6)而不经过红线的方法数,不经过红线的方法树有对称线可知,(0,0)到(6,6)和(0,0)到(5,7)方法数是一样的,由此此问题可以使用卡特兰数公式。

#include <iostream>
using namespace std;
const int mod=1e9+7;
typedef long long ll;
 
int qmi(int a,int k,int p){
    int res=1;
    while(k){
        if(k&1)res=(ll)res*a%p;
        a=(ll)a*a%p;
        k>>=1;
    }
    return res;
}
 
int main(){
    int n;
    cin>>n;
    int a=2*n,b=n;
    int res=1;
    for(int  i=a;i>a-b;i--)res=(ll)res*i%mod;
    for(int i=1;i<=b;i++)res=(ll)res*qmi(i,mod-2,mod)%mod;
    
    res=(ll)res*qmi(n+1,mod-2,mod)%mod;
    cout<<res<<endl;
}
相关文章
LeetCode题解-让所有学生保持开心的分组方法数
LeetCode题解-让所有学生保持开心的分组方法数
|
5月前
|
存储
【洛谷 P2141】[NOIP2014 普及组] 珠心算测验 题解(集合+多重循环)
**NOIP2014普及组的珠心算测验题要求参赛者找出给定集合中多少个数可表示为其他两个不同数的和。输入含n个正整数,输出满足条件的数的个数。样例输入4个数,输出2,因1+2=3且1+3=4。代码利用集合存储和,遍历所有数对组合,当找到匹配和时插入集合,最后输出集合大小。注意数据规模为n≤100,数不超过10,000。**
125 0
|
6月前
【错题集-编程题】数组中的最长连续子序列(排序 + 模拟)
【错题集-编程题】数组中的最长连续子序列(排序 + 模拟)
|
6月前
|
算法 搜索推荐 程序员
第四十六练 请以递归方式实现计算整数列表的和
第四十六练 请以递归方式实现计算整数列表的和
44 2
|
6月前
|
算法 搜索推荐 程序员
第四十七练 请以递归方式实现计算整数列表的最大值
第四十七练 请以递归方式实现计算整数列表的最大值
48 2
|
6月前
|
机器学习/深度学习 存储 算法
【算法训练-回溯算法 三】【回溯算法最佳实践】括号生成、复原IP地址
【算法训练-回溯算法 三】【回溯算法最佳实践】括号生成、复原IP地址
54 0
P1308 [NOIP2011 普及组] 统计单词数(模拟加函数+数学分析)
P1308 [NOIP2011 普及组] 统计单词数(模拟加函数+数学分析)
76 0