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

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

1、卡特兰数

卡 特 兰 数 : 卡特兰数: : f ( n ) = C 2 n n − C 2 n n − 1 = C 2 n n n + 1 f(n)=C_{2n}^n-C_{2n}^{n-1}=\frac{C_{2n}^n}{n+1} f(n)=C2nnC2nn1=n+1C2nn

2、满足条件的01序列

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

输出的答案对109+7取模。

输出格式
共一行,包含整数n。

输出格式
共一行,包含一个整数,表示答案。

数据范围
1≤n≤105

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

分析:

样例:
n = 3 时 , 我 们 将 整 个 01 序 列 中 1 的 个 数 视 作 为 y 轴 纵 坐 标 的 值 , 0 的 个 数 视 作 x 轴 横 坐 标 的 值 。 n=3时,我们将整个01序列中1的个数视作为y轴纵坐标的值,0的个数视作x轴横坐标的值。 n=3011y0x

这 样 , 每 一 种 01 序 列 的 排 列 都 对 应 一 条 从 ( 0 , 0 ) 到 ( 3 , 3 ) 的 路 径 。 这样,每一种01序列的排列都对应一条从(0,0)到(3,3)的路径。 01(0,0)(3,3)

现 要 求 每 一 个 前 缀 的 0 的 个 数 要 大 于 等 于 1 的 个 数 , 即 对 于 路 径 上 的 每 个 位 置 ( x i , y i ) 需 满 足 x i > = y i 。 现要求每一个前缀的0的个数要大于等于1的个数,即对于路径上的每个位置(x_i,y_i)需满足x_i>=y_i。 01(xi,yi)xi>=yi

对 应 到 坐 标 轴 上 , 就 是 路 径 上 的 每 个 位 置 需 保 证 在 橙 色 直 线 上 或 者 以 下 。 对应到坐标轴上,就是路径上的每个位置需保证在橙色直线上或者以下。 线
在这里插入图片描述
可 见 , 从 ( 0 , 0 ) 到 ( 3 , 3 ) , 需 要 沿 x 轴 正 方 向 走 3 步 , 沿 y 轴 正 方 向 走 3 步 , 路 径 总 方 案 数 为 C 6 3 , 即 6 步 当 中 有 3 步 沿 x 轴 。 可见,从(0,0)到(3,3),需要沿x轴正方向走3步,沿y轴正方向走3步,路径总方案数为C_6^3,即6步当中有3步沿x轴。 (0,0)(3,3)沿x3沿y3C6363沿x

当 然 还 要 除 去 不 合 法 的 一 部 分 路 径 , 作 红 色 直 线 。 当然还要除去不合法的一部分路径,作红色直线。 线

所 有 经 过 红 色 直 线 上 的 点 再 到 ( 3 , 3 ) 的 路 径 都 是 不 合 法 的 。 如 上 图 中 的 绿 色 路 径 。 所有经过红色直线上的点再到(3,3)的路径都是不合法的。如上图中的绿色路径。 线(3,3)绿

每 一 条 不 合 法 路 径 都 唯 一 对 应 于 一 条 终 点 关 于 红 线 与 ( 3 , 3 ) 对 称 的 路 径 , 即 上 图 蓝 色 路 径 , 终 点 为 ( 2 , 4 ) 。 每一条不合法路径都唯一对应于一条终点关于红线与(3,3)对称的路径,即上图蓝色路径,终点为(2,4)。 线(3,3)(2,4)

于 是 不 合 法 路 径 的 总 数 量 即 从 ( 0 , 0 ) 到 ( 2 , 4 ) 的 路 径 数 量 , 为 C 6 2 。 于是不合法路径的总数量即从(0,0)到(2,4)的路径数量,为C_6^2。 (0,0)(2,4)C62

总 的 合 法 路 径 数 量 为 C 6 3 − C 6 2 。 总的合法路径数量为C_{6}^3-C_{6}^{2}。 C63C62

故 一 般 地 , 有 总 合 法 路 径 数 量 为 C 2 n n − C 2 n n − 1 = C 2 n n n + 1 。 故一般地,有总合法路径数量为C_{2n}^n-C_{2n}^{n-1}=\frac{C_{2n}^n}{n+1}。 C2nnC2nn1=n+1C2nn

具体落实:

只 求 一 个 组 合 数 , 可 以 直 接 根 据 定 义 计 算 : 只求一个组合数,可以直接根据定义计算:

C a b = a ! ( a − b ) ! ⋅ b ! = a ( a − 1 ) ( a − 2 ) . . . ( a − b + 1 ) b ! C_{a}^b=\frac{a!}{(a-b)!·b!}=\frac{a(a-1)(a-2)...(a-b+1)}{b!} Cab=(ab)!b!a!=b!a(a1)(a2)...(ab+1)

本 题 求 公 式 : 本题求 公式:

C 2 n n n + 1 = 1 n + 1 ⋅ 2 n ! ( 2 n − n ) ! ⋅ n ! = 1 n + 1 ⋅ 2 n ( 2 n − 1 ) ( 2 n − 2 ) . . . ( n + 1 ) n ! \frac{C_{2n}^n}{n+1}=\frac{1}{n+1}·\frac{2n!}{(2n-n)!·n!}=\frac{1}{n+1}·\frac{2n(2n-1)(2n-2)...(n+1)}{n!} n+1C2nn=n+11(2nn)!n!2n!=n+11n!2n(2n1)(2n2)...(n+1)

模 数 1 0 9 + 7 是 质 数 , 费 马 小 定 理 + 快 速 幂 求 逆 元 取 模 即 可 。 模数10^9+7是质数,费马小定理+快速幂求逆元取模即可。 109+7+

代码:

#include<iostream>

#define ll long long

using namespace std;

const int mod = 1e9+7;

int n;

ll quick_pow(ll a,ll b)
{
    ll ans=1;
    while(b)
    {
        if(b&1) ans=ans*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ans;
}

int main()
{
    cin>>n;
    
    ll ans=1;
    int a=2*n,b=n;
    for(int i=a;i>a-b;i--) ans=ans*i%mod;
    for(int i=1;i<=b;i++) ans=ans*quick_pow(i,mod-2)%mod;
    ans=ans*quick_pow(n+1,mod-2)%mod;
    
    cout<<ans<<endl;
    
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值