当前位置: 首页 > news >正文

P1375 小猫【洛谷算法习题】

P1375 小猫

网页链接

P1375 小猫

题目描述

2 n 2n2n只小猫站成一圈,主人小明想把它们两两之间用绳子绑住尾巴连在一起。同时小明是个完美主义者,不容许看到有两根绳子交叉。请问小明有几种连线方案,可以把让所有小猫两两配对?

方案数很大,仅需输出方案数模10 9 + 7 10^9+7109+7(一个质数)的值。

输入格式

输入共一行,一个整数n nn

输出格式

输出方案数对10 9 + 7 10^9+7109+7取模后的值。

输入输出样例 #1

输入 #1

3

输出 #1

5

说明/提示

数据范围

  • 对于60 % 60\%60%的数据,1 ≤ N ≤ 100 1\le N \le 1001N100
  • 对于100 % 100\%100%的数据,1 ≤ N ≤ 10 5 1\le N \le 10^51N105

解题思路

本题是卡特兰数的经典应用——圆周非交叉完美匹配问题,通过卡特兰数通项公式结合模逆元即可高效求解。

  1. 模型转化与卡特兰数对应
    2n只小猫围成一圈、两两连线不交叉,等价于「圆周上2n个点的非交叉完美匹配」,方案数恰好对应第n个卡特兰数。
    推导:固定任意一个起点,若它与第2k个点配对,这条连线会将圆周分割为两个独立的子区域,分别包含2(k-1)和2(n-k)个点,子区域各自独立配对。方案数满足递推关系:
    f ( n ) = ∑ i = 0 n − 1 f ( i ) ⋅ f ( n − 1 − i ) f(n) = \sum_{i=0}^{n-1} f(i) \cdot f(n-1-i)f(n)=i=0n1f(i)f(n1i)
    初始条件f ( 0 ) = 1 f(0)=1f(0)=1,与卡特兰数的递推定义完全一致。

  2. 卡特兰数通项与模运算处理
    第n项卡特兰数的通项公式为:
    C a t ( n ) = 1 n + 1 ( 2 n n ) Cat(n) = \frac{1}{n+1} \binom{2n}{n}Cat(n)=n+11(n2n)
    由于模数10 9 + 7 10^9+7109+7是质数,除法需转化为模意义下的乘法逆元。根据费马小定理,x xx的逆元为x m o d − 2 m o d m o d x^{mod-2} \bmod modxmod2modmod,因此公式可改写为:
    C a t ( n ) = ( 2 n n ) × i n v ( n + 1 ) ( m o d m o d ) Cat(n) = \binom{2n}{n} \times inv(n+1) \pmod{mod}Cat(n)=(n2n)×inv(n+1)(modmod)

  3. 组合数快速计算

  • 预处理阶乘数组:线性递推得到0 ! ∼ 2 n ! 0! \sim 2n!0!2n!的模值,时间复杂度O ( n ) O(n)O(n)
  • 组合数计算:( a b ) = f a c t [ a ] × i n v ( f a c t [ b ] ) × i n v ( f a c t [ a − b ] ) ( m o d m o d ) \binom{a}{b} = fact[a] \times inv(fact[b]) \times inv(fact[a-b]) \pmod{mod}(ba)=fact[a]×inv(fact[b])×inv(fact[ab])(modmod),通过快速幂计算阶乘的逆元。

算法总时间复杂度为O ( n ) O(n)O(n),完全适配n ≤ 10 5 n \le 10^5n105的数据约束。

总结

核心逻辑:将圆周非交叉配对问题映射为卡特兰数模型,通过阶乘预处理与费马小定理求逆元,快速计算组合数得到最终方案数。
关键操作:卡特兰数模型对应、阶乘线性预处理、快速幂求逆元、模运算下的组合数计算。
效率保障:线性时间预处理阶乘,单次查询常数时间计算,十万级数据无运行压力。

代码简要说明

  1. 快速幂函数qpow:实现模意义下的快速幂运算,用于计算乘法逆元。
  2. 阶乘初始化init:递推计算阶乘数组cc[i]存储i ! m o d m o d i! \bmod modi!modmod,从0到最大长度依次线性计算。
  3. 组合数函数C:基于阶乘与逆元计算组合数( n m ) \binom{n}{m}(mn),分别乘以分子阶乘、分母两个阶乘的逆元,全程取模保证结果合法。
  4. 卡特兰数函数Catalan:先计算组合数( 2 n n ) \binom{2n}{n}(n2n),再乘以n + 1 n+1n+1的模逆元,得到第n项卡特兰数。
  5. 主函数:读取n值,完成阶乘预处理,调用卡特兰数函数计算结果并输出。
  6. 输入优化:关闭同步流并解绑tie,提升输入输出效率。

代码内容

#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'typedeflonglongll;typedefunsignedlonglongull;typedefvector<vector<ll>>vvt;typedefpair<ll,ll>pll;constll N=1e3+10;constll INF=1e18;constll M=1e6+10;constll mod=1e9+7;constll maxn=200005;constll maxs=200002;ll f[maxn],c[maxn],ans;llqpow(ll a,ll x){ll r=1;while(x){if(x&1)r=r*a%mod;a=a*a%mod;x>>=1;}returnr;}voidinit(){c[0]=1;for(ll i=1;i<=maxs;i++)c[i]=c[i-1]*i%mod;}llC(ll n,ll m){returnc[n]*qpow(c[m],mod-2)%mod*qpow(c[n-m],mod-2)%mod;}llCatalan(ll n){returnC(2*n,n)*qpow(n+1,mod-2)%mod;}intmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);ll n;cin>>n;init();cout<<Catalan(n)<<endl;return0;}
http://www.jsqmd.com/news/1099850/

相关文章:

  • 为什么你的vmx文件压缩后反而增大?深度解析NTFS稀疏文件、零填充与TRIM指令协同失效原理
  • 题材多元口碑在线 高分游戏承包你的游玩档期
  • 跨越微伏级噪声鸿沟:硬核解析工业微弱传感器信号调理与高精度捕获实战
  • 村花云 - 高性价比云服务器服务平台
  • 汇编——比较指令和条件跳转指令
  • Ubuntu 系统安装 Hermes Agent 使用教程
  • web安全代码基础-PHP(模板组件插件安全)
  • FastAPI 基础篇:类型注解驱动的 Python Web 开发范式
  • OpenHarness源码研究-4-AgentLoop对话引擎与工具系统
  • 如何深度掌控AMD Ryzen处理器:专业硬件调试工具完全指南
  • ros2 humble安装anaconda
  • 机器人-混合关节架构
  • Certbot:免费自动化 HTTPS 证书管理工具
  • 2026年桌面风扇推荐:三款不同功能定位机型,按需选择不踩坑
  • 【毕设级】SpringBoot + MySQL + Thymeleaf 实现高校教材征订管理系统(班级统订+个人补订)
  • Linux生产环境硬盘挂载:告别盘符漂移,使用UUID实现稳定自动挂载
  • 手把手教你用SM2259XT2开卡工具修复固态硬盘(附B0KB颗粒实测)
  • 小学期记录
  • Awesome LLM Skills:给 AI 编程助手装上各种技能包
  • 3分钟掌握深度学习漫画翻译神器:BallonsTranslator完全指南
  • 机器人-从“性能参数领先”转向“工业化能力领先”
  • 效率够高吗?8款AI论文网站排行榜,毕业季救星!
  • Docker部署-非root用户openEuler 20.03部署
  • How To Secure A Linux Server:一份持续更新的服务器安全加固手册
  • 2026年6月个人工作生活总结
  • Linux Page Cache 导致视频解码第一次慢、第二次快的原因分析与缓存清理方法
  • PYTHON+AI LLM DAY NINTY-TWO
  • vmware安装win10教程(保姆级图文):VMware16虚拟机部署Windows10,附win10镜像iso文件下载
  • OpenHarness源码研究-3-codex配置到输出对话
  • PDF转Excel免费工具推荐,批量转换不收费绿色版