AcWing 889. 满足条件的01序列(卡塔兰数模板)

题目链接:点击这里

在这里插入图片描述

约定: 0 0 表示向右走一格, 1 1 表示向左走一格,那么每一个路径对应着一个排列。

以从 ( 0 , 0 ) (0,0) ( 6 , 6 ) (6,6) 为例,总的路径数为 C 12 6 C_{12}^6 ,非法的路径(红线以上)数为 C 12 5 C_{12}^5 ,故合法方案为 C 12 6 C 12 5 C_{12}^6-C_{12}^5

( 0 , 0 ) (0,0) ( n , n ) (n,n) 的方案数为 C 2 n n C 2 n n 1 C_{2n}^n-C_{2n}^{n-1} ,组合式展开可得 C 2 n n n + 1 \frac{C_{2n}^n}{n+1}

#include<iostream>
#include<cstdio>

using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;

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

int main()
{
    int n;
    scanf("%d", &n);
    
    int a = 2 * n, b = n;
    
    int ans = 1;
    for(int i = a; i > a - b; --i)  ans = (ll)ans * i % mod;
    for(int i = 1; i <= b; ++i) ans = (ll)ans * qmi(i, mod - 2, mod) % mod;
    
    ans = (ll)ans * qmi(n + 1, mod - 2, mod) % mod;
    
    printf("%d\n", ans);
    
    return 0;
}
发布了811 篇原创文章 · 获赞 127 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/104819753