
AcWing 889 满足条件的01序列
发布日期:2021-05-28 16:27:12
浏览次数:31
分类:精选文章
本文共 1038 字,大约阅读时间需要 3 分钟。
为了解决这个问题,我们需要计算给定n个0和n个1能够排列成的满足特定前缀条件的序列数量。这个问题可以通过卡特兰数来解决。下面我们详细描述了解决这个问题的方法。
方法思路
问题理解:我们需要计算长度为2n的序列中,满足任何前缀中0的数量至少不少于1的数量的排列数。这类似于匹配合法的括号序列问题。
卡特兰数:本问题可以转换为求解卡特兰数。给定n个左括号和n个右括号,合法括号序列的数量为卡特兰数C(n) = C(2n, n) / (n + 1),其中C(2n, n)是组合数。
计算卡特兰数:使用快速幂计算求乘法逆元来处理大数模运算。组合数C(2n, n)可以通过预计算阶乘和逆阶乘来高效计算。
预计算:预计算阶乘和逆阶乘数组,利用费马小定理计算逆元,从而高效处理模运算。
解决代码
MOD = 10**9 + 7n = int(input())if n == 0: print(1) exit()max_n = 2 * nfact = [1] * (max_n + 1)for i in range(1, max_n + 1): fact[i] = fact[i-1] * i % MODinv_fact = [1] * (max_n + 1)inv_fact[max_n] = pow(fact[max_n], MOD-2, MOD)for i in range(max_n - 1, -1, -1): inv_fact[i] = inv_fact[i+1] * (i+1) % MODc = fact[2*n] * inv_fact[n] % MODc = c * inv_fact[n] % MODdenominator = n + 1inv_denominator = pow(denominator, MOD-2, MOD)result = c * inv_denominator % MODprint(result)
代码解释
输入处理:读取输入值n,处理特殊情况n=0。
阶乘预计算:计算从0到2n的阶乘,并对每一步结果取模。
逆阶乘预计算:从2n开始逆推计算逆阶乘,每一步结果也对MOD取模。
组合数计算:使用预计算的阶乘和逆阶乘计算组合数C(2n, n)。
逆元计算:计算分母n+1的逆元,用于处理除法。
结果计算:将组合数乘以逆元,得到最终结果并输出。
这个解决方案通过预计算和快速幂高效地处理大数问题,确保在合理的时间内解决问题。
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2025年03月21日 14时53分21秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
转:Qt信号槽的一些事
2021-05-04
QT动画框架:属性动画
2021-05-04
泛型算法:查找初始最长有序子序列算法is_sorted_until()
2021-05-04
泛型算法:不完全排序nth_element()
2021-05-04
windowsC盘msp文件清理
2021-05-04
进程切换与线程切换的区别
2021-05-04
Linux部署sendmail邮件服务器
2021-05-04
Centos7部署NFS-V4
2021-05-04
FASTDFS ERROR 客户端连接服务端出现了io异常
2021-05-04
写了一个测试的webservice项目,如何在服务器上运行jar包 JAVA项目启动脚本
2021-05-04
222. Count Complete Tree Nodes
2021-05-04
13. Roman to Integer
2021-05-04
“路西法”利用Windows系统漏洞攻击并进行恶意挖矿!
2021-05-04
数学_几何+中位数
2021-05-04
C语言和32位汇编语言关于if-else分支结构的对比分析
2021-05-04
阿里云服务器中XAMPP(Apache)无法用外网访问的原因之一
2021-05-04
Java小白的入门之路
2021-05-04
少儿编程100讲轻松学python(一)-python怎么打开
2021-05-04
MYSQL安装以及遇到的问题
2021-05-04