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

题解:AcWing 885 求组合数I

【题目来源】

AcWing:885 求组合数 I - AcWing题库

【题目描述】

给定 \(n\) 组询问,每组询问给定两个整数 \(a,b\),请你输出 \(C_a^b\ mod\ (10^9+7)\) 的值。

【输入】

第一行包含整数 \(n\)

接下来 \(n\) 行,每行包含一组 \(a\)\(b\)

【输出】

\(n\) 行,每行输出一个询问的解。

【输入样例】

3
3 1
5 3
2 2

【输出样例】

3
10
1

【核心思想】

  1. 问题分析:给定 \(n\) 组询问,每组询问给定两个整数 \(a, b\),要求计算组合数 \(C_a^b \bmod (10^9+7)\) 的值。这是一个经典的组合计数问题,数据范围较小(\(a \leq 2000\)),适合使用递推预处理的方法在 \(O(N^2)\) 时间内预计算出所有组合数,之后每次查询 \(O(1)\) 输出。

  2. 算法选择

    • 递推法(杨辉三角):利用组合数的递推关系 \(C(n, k) = C(n-1, k) + C(n-1, k-1)\),从边界情况出发逐步填表
    • 动态规划思想:将问题分解为子问题,每个组合数依赖于上方和左上方的两个值,避免重复计算
    • 模运算:每一步计算都对 \(10^9+7\) 取模,防止整数溢出
  3. 关键步骤

    • 预处理组合数表
      • 初始化二维数组 c[N][N],其中 c[i][j] 表示 \(C_i^j \bmod (10^9+7)\)
      • 边界条件:对于所有 \(i \in [0, N)\),`c[i][0] = 1\((\)C_i^0 = 1$)
      • 递推填表:对于 \(i\)\(0\)\(N-1\)\(j\)\(1\)\(i\)
        • c[i][j] = (c[i-1][j] + c[i-1][j-1]) % mod
      • 总预处理时间 \(O(N^2)\),其中 \(N = 2005\)
    • 处理查询
      • 读取询问组数 \(n\)
      • 对于每组询问 \((a, b)\)
        • 直接查表输出 c[a][b]
      • 单次查询时间 \(O(1)\)
  4. 时间/空间复杂度

    • 时间复杂度:\(O(N^2 + n)\),预处理 \(O(N^2)\)\(N = 2000\)),每次查询 \(O(1)\)
    • 空间复杂度:\(O(N^2)\),存储组合数表 c[N][N]
  5. 递推法求组合数的核心思想

    • 递推公式来源:从 \(n\) 个元素中选 \(k\) 个,考虑第 \(n\) 个元素:若选,则需从前 \(n-1\) 个中选 \(k-1\) 个(\(C(n-1, k-1)\));若不选,则需从前 \(n-1\) 个中选 \(k\) 个(\(C(n-1, k)\))。故 \(C(n, k) = C(n-1, k) + C(n-1, k-1)\)
    • 与杨辉三角的关系:组合数表就是杨辉三角,每个数等于上方两数之和
    • 预处理策略:当查询次数多而数据范围不大时,预处理所有组合数并查表,比每次用阶乘+逆元计算更高效
    • 取模处理:加法取模可在每次加法后立即进行,避免中间结果溢出
    • 适用于 \(n\) 较小(通常 \(n \leq 2000\))且查询次数多的组合数计算场景

【解题思路】

【算法标签】

排列组合

【代码详解】

#include <bits/stdc++.h>
using namespace std;const int N = 2005, mod = 1e9 + 7; // 定义常量 N 和 mod
int c[N][N]; // c 数组存储组合数 C(i, j)// 初始化组合数表
void init()
{for (int i = 0; i < N; i++) { // 遍历 i 从 0 到 N-1for (int j = 0; j <= i; j++) { // 遍历 j 从 0 到 iif (j == 0) c[i][j] = 1; // 如果 j 为 0,C(i, 0) = 1else c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % mod; // 递推计算 C(i, j)}}
}int main()
{int n; // 定义整数 n,表示查询的次数init(); // 初始化组合数表cin >> n; // 输入查询的次数 nwhile (n--) { // 遍历每个查询int a, b; // 定义整数 a 和 bcin >> a >> b; // 输入 a 和 bcout << c[a][b] << endl; // 输出组合数 C(a, b)}return 0; // 程序结束
}
#include <bits/stdc++.h>
using namespace std;const int N = 2005;         // 最大n值
const int mod = 1e9 + 7;    // 模数,用于防止溢出int c[N][N];  // 组合数表,c[n][k] 表示 C(n, k) mod mod// 初始化组合数表(递推法)
void init()
{for (int i = 0; i < N; i++)  // 遍历所有n{for (int j = 0; j <= i; j++)  // 对于每个n,遍历所有k (0 ≤ k ≤ n){if (!j)  // 基本情况1:C(n, 0) = 1{c[i][j] = 1;}else{// 递推公式:C(n, k) = C(n-1, k) + C(n-1, k-1)c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;}}}
}int main()
{// 预处理组合数表init();int n;  // 查询次数cin >> n;while (n--)  // 处理每个查询{int a, b;  // 输入n和kcin >> a >> b;// 直接查表输出组合数cout << c[a][b] << endl;}return 0;
}

【运行结果】

3
3 1
3
5 3
10
2 2
1
http://www.jsqmd.com/news/1064051/

相关文章:

  • 从零到百万:Scrapy-Redis分布式爬虫架构实战——高效抓取电商商品URL的终极指南
  • 2026杭州旅游大巴包车公司排名 正规服务商盘点 - 资讯纵览
  • 山东连锁品牌加盟缺客源?2026年试试佑城GEO的AI获客 - GrowUME
  • 2026年大件物流哪家口碑好 多维度指南帮你选出靠谱服务商 - 资讯纵览
  • 014、注释与 PEP8:写出让人读得懂、AI 抄得对的 Python 代码
  • Jmeter压力测试实战:异步秒杀接口性能验证与RabbitMQ削峰填谷效果分析
  • 2026年南京地下室排水泵半夜故障,业主如何找到靠谱上门维修? - 信息热点
  • 在霍山好吃的火锅推荐,本地人常去的靠谱火锅店盘点 - 信息热点
  • AD软件的使用(3)
  • React Class组件转函数组件:从语法转换到范式升级
  • 2026年6月音响改装品牌推荐,路虎原厂音响升级/理想原车音响升级/问界音响改装/问界原厂音响升级,音响改装门店哪个好 - 音响改装门店分享
  • 基于MCF51AC256的无传感器PMSM矢量控制:从原理到工程实践
  • 创业团队技术选型:从决策框架到成本模型的系统化方法论
  • i.MX处理器引脚配置实战:从寄存器操作到Processor Expert图形化工具
  • 寄多双鞋子怎么寄最省钱?试试比价省一半 - 快递物流资讯
  • 终极指南:如何利用开源相位恢复资源库加速你的光学成像研究 [特殊字符]
  • NXP LS2088A SEC硬件IPsec ESP隧道模式PDB配置详解与实战
  • 大同市嘉年华国际旅行社服务解析:五大核心选型参考指标 - 资讯纵览
  • 政采服务平台哪家强?2026核心维度对比指南 - 资讯纵览
  • 拉萨渗漏维修靠谱机构盘点 2026、全屋防水堵漏正规企业实力排名一览 - 宅安选房屋修缮
  • 高端总裁班培训课程如何筛选?2026年企业管理培训公司 - 信息热点
  • 双语Transformer模型的跨语言激活机制研究
  • 值得信赖的高端地毯上门试铺企业推荐 - 信息热点
  • 2026年广元大闸蟹礼盒TOP6榜单揭晓:本地化服务与性价比深度评测 - 信息热点
  • 2026年 扬州外贸SEO内容代写代发服务推荐榜:专业策略与高效落地的口碑优选 - 品牌发掘
  • 大模型推理架构重构:从单体引擎到状态驱动分层设计
  • i.MX23中断控制器实战:优先级、使能与软件中断配置详解
  • 新房除醛自助治理踩坑实录 2026常见误区梳理与靠谱产品推荐 - 资讯纵览
  • Qwen3.6 MoE架构解析:激活参数优化与开源调度实践
  • 2026年西安家装白皮书:十大装修公司实力排名及避坑指南 - 信息热点