数学-满足条件的01序列-卡特兰数
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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)