各种逆元求法 组合数取模 comb (组合数 Lucas)

博客介绍了如何在模9901下计算组合数C(m,n)的问题,针对不同数据规模提供了策略,包括直接计算、预处理逆元和利用Lucas定理。还讨论了几种求逆元的方法,如扩展欧几里得、费马小定理和递推求阶乘逆元,并指出Lucas定理可以进一步优化组合数计算。" 96020906,8584052,Hibernate一对多关系映射实战,"['Java', 'ORM', 'Hibernate', '数据库映射', '持久化框架']
摘要由CSDN通过智能技术生成

组合数取模(comb)

【问题描述】
计算C(m,n)mod 9901的值
【输入格式】
从文件comb.in中输入数据。
输入的第一行包含两个整数,m和n
【输出格式】
输出到文件comb.out中。
输出一行,一个整数
【样例输入】
2 1
【样例输出】
2

【数据规模与约定】
对于 20%的数据,n<=m<=20
对于 40%的数据,n<=m<=2000
对于 100%的数据,n<=m<=20000

题解:组合数取模(comb)
对于 20%数据:m<=20,直接计算最后取模。
对于 40%数据:m<=2000,预处理 1~2000 的逆元,暴力计算。
对于 100%数据:m<=20000,使用 lucas 定理把缩小至 9901 以内,再用上一个方
法计算。

求组合数直接算阶乘肯定是不行的,会爆。(不能边算边mod,做除法是会出错)递推太慢了,舍弃。那么怎么办呢?只好又回去考虑,既然一定要取模,那么自然就想到一些在取模意义上相等的算法,要解决除法问题就剩下逆元(在模意义下将除法转为乘法)了。
逆元求法较多,下面提供几种:
(取模意义下除法 ->( a 除以 b )mod 一个数)
1.扩展欧几里得

inline long long extend_gcd(long long a,long long b,long long &x,long long &y){
    if(a == 0 && b == 0)
        return -1;
    if(b == 0){
        x = 1; y = 0;
        return a;
    }
    long long d = extend_gcd(b, a % b, y, x);
        y -= a / b * x;
    retu
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值