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

BISHI70 【模板】组合数

思路

求解代码

// 定义模数常量,用于所有取模运算privatestaticfinalintMOD=1000000007;// 定义最大计算范围常量privatestaticfinalintMAX_N=500001;// 存储阶乘值的数组privatestaticlong[]fact=newlong[MAX_N];// 存储阶乘逆元的数组privatestaticlong[]invFact=newlong[MAX_N];/** * 主方法 * 处理输入输出,调用预计算和组合数计算方法 * @param args 命令行参数 * @throws IOException 可能抛出的IO异常 */publicstaticvoidmain(String[]args)throwsIOException{// 使用BufferedReader读取输入,PrintWriter输出结果BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));PrintWriterout=newPrintWriter(newOutputStreamWriter(System.out));// 预计算阶乘和逆元precompute();// 读取测试用例数量intT=Integer.parseInt(br.readLine().trim());// 处理每个测试用例for(inti=0;i<T;i++){// 读取每行输入并分割String[]str=br.readLine().split("\\s+");intn=Integer.parseInt(str[0]);intm=Integer.parseInt(str[1]);// 输出组合数计算结果out.println(nCr(m,n));}// 清空输出缓冲区并关闭资源out.flush();out.close();br.close();}/** * 使用快速幂算法计算base的exp次方对MOD取模的结果 * 快速幂算法是一种高效计算幂运算的算法,时间复杂度为O(log n) * * @param base 底数 * @param exp 指数 * @return base的exp次方对MOD取模的结果 */privatestaticlongmypower(longbase,longexp){// 初始化结果为1对MOD取模,防止MOD为1时结果错误longans=1%MOD;// 当指数exp大于0时继续循环while(exp>0){// 如果当前指数是奇数,将base乘入结果if(exp%2==1){ans=(ans*base)%MOD;}// base平方,指数减半base=(base*base)%MOD;exp/=2;}// 返回最终结果returnans;}/** * 预计算阶乘和阶乘的逆元数组 * 使用动态规划方法计算阶乘数组fact[] * 使用费马小定理计算逆元数组invFact[] */privatestaticvoidprecompute(){// 初始化0的阶乘和0的阶乘逆元为1fact[0]=1;invFact[0]=1;// 动态规划计算阶乘数组for(inti=1;i<MAX_N;i++){fact[i]=(fact[i-1]*i)%MOD;}// 使用费马小定理计算最大阶乘的逆元invFact[MAX_N-1]=mypower(fact[MAX_N-1],MOD-2);// 逆向递推计算其他阶乘的逆元for(inti=MAX_N-2;i>=1;i--){invFact[i]=(invFact[i+1]*(i+1))%MOD;}}/** * 计算组合数 nCr,即从n个物品中选取r个物品的组合数 * 使用预计算阶乘和阶乘逆元的方法来高效计算组合数 * * @param n 总物品数 * @param r 选取物品数 * @return 组合数结果,对MOD取模 */privatestaticlongnCr(intn,intr){// 如果r小于0或大于n,组合数为0if(r<0||r>n){return0;}// 使用公式 nCr = n! / (r! * (n-r)!) 计算// 通过预计算的阶乘数组fact和阶乘逆元数组invFact来计算// 并对MOD取模,防止数值溢出return(((fact[n]*invFact[r])%MOD)*invFact[n-r])%MOD;}
http://www.jsqmd.com/news/403351/

相关文章:

  • 费雪的竞争优势分析:持续成功的关键
  • Flink与Hive集成:批流一体的大数据仓库方案
  • AI 与提示工程在环保场景的应用探索,提示工程架构师视角
  • 基于Simulink的悬架模型与主动悬架控制策略研究
  • C++ 多线程与并发系统取向(五)—— std::atomic:原子操作与状态一致性(类比 Java Atomic)
  • 2026.2.22
  • Python threading.Thread(target=lambda:[])
  • AI在法律尽职调查中的应用与架构实现
  • 实测50款东南亚语言配音工具,重点推荐以下性价比高的7款
  • 医疗器械手机APP开发工程师职位深度解析与面试指南
  • 深度解析:消费电子领域安卓开发工程师的核心能力与实践路径
  • 深度解析:苏州虹保世纪科技 Android 开发工程师职位要求与面试准备
  • 提示工程架构师必知:安全标准的评估方法
  • 芒格的“极端后果“思维在气候适应性技术投资中的应用
  • Python implement repeatable functions via while True loop and time.sleep
  • Python repeatable timer to implement recycled printing via schedule
  • 使用embedding进行分词 - f
  • 【开题答辩全过程】以 哈尔滨市小酒窝APP为例,包含答辩的问题和答案
  • 基于小信号建模的下垂控制稳定分析,文章完全浮现。 关键词:微电网,下垂控制,小信号模型,根轨迹...
  • flex与bison学习之字符统计程序
  • 含共享储能的园区多类型负荷需求响应经济运行研究附Matlab代码
  • 含中间直流的三相电力电子变压器PET仿真模型附Simulink仿真
  • D证科目一罚款专题
  • Java 运行时异常和编译时异常之间的区别是什么?
  • 光伏阵列常见故障仿真模型附Simulink仿真
  • 根脉与花开:AI元人文——***文化思想在智能时代的原创性理论发展
  • 什么是 Java 中的自动装箱和拆箱?
  • 光伏储能直流系统MATLAB仿真(PV光伏阵列+Boost DCDC变换器+负载+双向DCDC变换器+锂离子电池系统)附Matlab代码
  • 基于1D-GAN生成对抗网络的数据生成方法研究附Matlab代码
  • 什么是 Java 中的迭代器(Iterator)?