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

题解:AcWing 888 求组合数 IV

【题目来源】

AcWing:888. 求组合数 IV - AcWing题库

【题目描述】

输入 \(a,b\),求 \(C_a^b\) 的值。

注意结果可能很大,需要使用高精度计算。

【输入】

共一行,包含两个整数 \(a\)\(b\)

【输出】

共一行,输出 \(C_a^b\) 的值。

【输入样例】

5 3

【输出样例】

10

【算法标签】

《AcWing 888 求组合数IV》 #组合数学# #组合计数# #高精度#

【代码详解】

#include <bits/stdc++.h>
using namespace std;const int N = 5005;  // 质数表大小
int primes[N], cnt;  // primes存储质数,cnt是质数个数
bool st[N];          // 筛法标记数组
int sum[N];          // 存储每个质因子的指数// 线性筛法求1~n的所有质数
void get_primes(int n)
{for (int i = 2; i <= n; i++){if (!st[i])  // 如果i是质数{primes[cnt++] = i;  // 加入质数表}// 用当前已得到的质数筛掉合数for (int j = 0; primes[j] <= n / i; j++){st[primes[j] * i] = true;  // 标记合数if (i % primes[j] == 0)  // 如果primes[j]是i的最小质因数{break;  // 保证每个合数只被最小的质因数筛掉}}}
}// 计算n!中质因子p的指数(勒让德定理)
int get(int n, int p)
{int res = 0;  // 指数结果// 勒让德公式:n!中质因子p的指数 = ⌊n/p⌋ + ⌊n/p²⌋ + ⌊n/p³⌋ + ...while (n){res += n / p;  // 计算⌊n/p⌋n /= p;        // 继续计算下一项}return res;
}// 高精度乘法:大整数A乘以小整数b
vector<int> mul(vector<int> &A, int b)
{vector<int> C;  // 存储结果int t = 0;  // 进位for (int i = 0; i < A.size() || t; i++)  // 遍历A的每一位或还有进位{if (i < A.size())  // 如果A还有位数{t += A[i] * b;  // 当前位乘以b加上进位}C.push_back(t % 10);  // 取个位t /= 10;              // 计算进位}// 去掉前导0,但保留最后一位0(如果结果就是0)while (C.size() > 1 && C.back() == 0){C.pop_back();}return C;
}int main()
{int a, b;  // 输入C(a, b)cin >> a >> b;// 1. 筛出1~a的所有质数get_primes(a);// 2. 计算组合数C(a,b)的质因数分解for (int i = 0; i < cnt; i++){int p = primes[i];  // 当前质数// 勒让德公式计算C(a,b)中质因子p的指数// C(a,b) = a! / (b! * (a-b)!)// 指数 = 在a!中的指数 - 在b!中的指数 - 在(a-b)!中的指数sum[i] = get(a, p) - get(b, p) - get(a - b, p);}// 3. 用高精度乘法计算结果vector<int> res;  // 存储高精度结果,低位在前res.push_back(1);  // 初始化为1// 遍历所有质因子for (int i = 0; i < cnt; i++){int p = primes[i];  // 当前质数int exp = sum[i];   // 质因子p的指数// 将p乘exp次for (int j = 0; j < exp; j++){res = mul(res, p);}}// 4. 输出结果(从高位到低位)for (int i = res.size() - 1; i >= 0; i--){cout << res[i];}cout << endl;return 0;
}

【运行结果】

5 3
10
http://www.jsqmd.com/news/409322/

相关文章:

  • 题解:AcWing 887 求组合数 III
  • Java 方法引用
  • Java基础(下)之Stream
  • Java基础(下)之方法引用
  • 题解:AcWing 886 求组合数 II
  • 题解:AcWing 885 求组合数 I
  • 功能炸裂!推荐一款低代码数据大屏可视化系统,内置丰富模版,支持拖拽构建炫酷大屏
  • 视频孪生终结者:镜像视界空间神经系统与空间控制权重构——融合统一空间坐标反演体系 × 三维实时定位引擎 × 多路径概率展开模型 × 前向围堵优化算法的跨行业空间压制与主动调度控制平台
  • 大数据领域数据产品的搜索功能优化
  • AI原生应用开发:如何利用Copilot实现代码质量与效率双提升
  • HNOI 2026 退役记
  • 从零开始:使用 Claude Code 打造字母消除游戏
  • 价值投资中的AI智能体可持续发展能力分析系统
  • AI模型部署自动化的核心:镜像+编排+监控的三位一体设计
  • 微信小程序 uniapp+vue老年人心血管健康
  • 基于径向基神经网络(RBF)预制构件需求量预测GUI软件
  • Sass/SCSS函数深度解析
  • 1亿条URL去重,怎么搞才不崩?生产级方案全解析(从入门到大厂实战)
  • 强化学习·价值学习-MC,TD和Q-learning算法
  • day95(2.24)——leetcode面试经典150
  • 强化学习·导论
  • 一些喜欢的 ACG 曲
  • 灰色关联度模型正负性问题的研究及其改进附Matlab代码
  • 小程序商城开发怎么选?5 家优质平台实测推荐,避开低价陷阱不踩雷 - 企业数字化改造和转型
  • 基于动态神经网络NARX/GRNN/BP/RBF的IBM收盘价预测-时间序列预测附Matlab代码
  • 性价比封神!微信小程序开发平台排名,零隐形消费平台优先选 - 企业数字化改造和转型
  • 基于经验模态分解和粒子群优化支持向量机(EMD+PSO_SVM)大坝变形预测附Matlab代码
  • Metasploit新手入门|从安装到首次漏洞探测
  • 高效科研工具:9大论文目录生成软件,自动更新功能详解
  • 中小商家首选|十大小程序开发公司排名,年费低至700元 - 企业数字化改造和转型