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

经典算法 求C(N, K) % mod,保证mod是质数

求C(N, K) % mod,保证mod是质数

问题描述

给你三个整数N,K,mod保证mod是一个质数,求组合数C(N, K) % mod。

输入描述

输入有多组,输入第一行为两个整数Tmod。接下来2 - T + 1行,每行输入NK

输出描述

每一组输入,输出C(N, K) % mod。

输入示例

9 1000003
6 4
7 5
3 2
10 5
100 50
1000 500
10000 5000
100000 50000
1000000 500000

输出示例

15
21
3
252
440004
175726
737315
781911
375001

c++代码(乘法逆元)

这种方法大致可以处理N,K<= 1000000,mod <= 1000000009。

保证mod为质数,用费马小定理求逆元。

#include<bits/stdc++.h>using namespace std;typedef __int128_t ll;//防止数据溢出long long T, N, K, mod;//保证mod是质数
vector<ll> jiecen;ll fastPow(ll a, ll b, ll mod) {//返回a^b % modif (b == 0) return 1 % mod;if (b == 1) return a % mod;ll k = fastPow(a, b / 2, mod);if (b % 2 == 0) return (k * k) % mod;else return (((k * k) % mod) * a) % mod;
}ll mod_inverse(ll A, ll mod) { return fastPow(A, mod - 2, mod); }//求A % mod 的逆元ll cnk(ll N, ll K, ll mod) { return (jiecen[N] * mod_inverse((jiecen[K] * jiecen[N - K]) % mod, mod)) % mod; }//返回组合数C(N, K) % modint main() {cin >> T >> mod;jiecen = vector<ll>(1000001, 1);//预处理阶乘for (int i = 1; i <= 1000000; i++) jiecen[i] = (jiecen[i - 1] * i) % mod;while(T--) {cin >> N >> K;cout << (long long)cnk(N, K, mod) << endl;}return 0;
}//by wqs

c++代码(卢卡斯定理)

大致可以处理N,K <= 1 * 10^18, mod <= 1000000。

卢卡斯递归过程中可能会出现N < K,这个时候cnk函数要返回0

#include<bits/stdc++.h>using namespace std;typedef __int128_t ll;vector<ll> jiecen;
long long T, N, K, mod;ll fastPow(ll a, ll b, ll mod) {//返回a^b % modif (b == 0) return 1 % mod;if (b == 1) return a % mod;ll k = fastPow(a, b / 2, mod);if (b % 2 == 0) return (k * k) % mod;else return (((k * k) % mod) * a) % mod;
}ll mod_inverse(ll A, ll mod) { return fastPow(A, mod - 2, mod); }//求A % mod 的逆元ll cnk(ll N, ll K, ll mod) { return N >= K ? (jiecen[N] * mod_inverse((jiecen[K] * jiecen[N - K]) % mod, mod)) % mod : 0; }//返回组合数C(N, K) % modll Lucas(ll N, ll K, ll mod) { return K == 0 ? 1 : (cnk(N % mod, K % mod, mod) * Lucas(N / mod, K / mod, mod)) % mod; }int main() {cin >> T >> mod;jiecen = vector<ll>(mod, 1);for (int i = 1; i <= mod - 1; i++) jiecen[i] = (__int128_t(jiecen[i - 1]) * i) % mod;while(T--) {cin >> N >> K;cout << (long long)Lucas(N, K, mod) << endl;}return 0;
}//by wqs
http://www.xdnf.cn/news/502795.html

相关文章:

  • 打造文本差异对比工具 TextDiffX:从想法到实现的完整过程
  • 嵌入式软件的分层架构
  • GitHub 趋势日报 (2025年05月16日)
  • H3C UIS 超融合管理平台原理解读以及日常运维实操与故障处理
  • Transformer 架构在目标检测中的应用:YOLO 系列模型解析
  • 便捷的批量打印工具推荐
  • PyQt5基本窗口控件(QSlider(滑动条))
  • 【计网】 ARP地址解析协议 [工作过程]
  • hyper-v 虚拟机怎么克隆一台一样的虚拟机?
  • NHANES指标推荐:FMI
  • 【Linux笔记】——Linux线程控制创建、终止与等待|动态库与内核联动
  • 软件测试的常用的面试题【带答案】
  • 【汇总】影视仓接口地址,影视仓最新配置接口【2025.5】
  • 常见图算法解析:TSP问题、最大团/独立集问题、图着色问题、哈密尔顿回路问题、顶点覆盖问题和最长路径问题
  • Ocean: Object-aware Anchor-free Tracking
  • 中级网络工程师知识点4
  • 【文本切割器】RecursiveCharacterTextSplitter参数设置优化指南
  • ORACLE RAC环境REDO日志量突然增加的分析
  • 【以及好久没上号的闲聊】Unity记录8.1-地图-重构与优化
  • SQL Server 常用函数
  • QT使用QXlsx读取excel表格中的图片
  • 【自然语言处理与大模型】大模型(LLM)基础知识④
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(23):受身形
  • mAP、AP50、AR50:目标检测中的核心评价指标解析
  • 开源项目实战学习之YOLO11:12.2 ultralytics-models-sam-decoders.py源码分析
  • Vue百日学习计划Day19-20天详细计划-Gemini版
  • 密文搜索-map容器+substr
  • javaDoc
  • 电子电器架构 --- 整车造车阶段四个重要节点
  • Java卡与SSE技术融合实现企业级安全实时通讯