乘法逆元

本文深入探讨了大数运算中的取模与乘法逆元概念,包括笔算求逆元、拓展欧几里得算法、费马小定理及欧拉函数的应用,同时介绍了线性求逆元和阶乘逆元的方法,结合具体题目如HDU6304和HDU3037进行实例解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大数取模 /乘法逆元 

int64 x当 x*x可能溢出int64时需要内部取模  (x%mod)*(x%mod)%mod

当出现求解(b/a)%mod=?问题时,可以转化到求解b*x%mod=?

其中x称为a关于mod的乘法逆元

1.笔算求a关于mod的乘法逆元x:

根据定义可知, a*x%mod=1  ->  a*x=1+y*mod  ->  x=(mod+1)/b   (:y=1)   ;

HDU6304 Chiaki Sequence Revisited 等差数列 乘法逆元

2.拓展欧几里得求a关于mod的乘法逆元x (任意情况)

long long ex_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=ex_gcd(b,a%b,y,x);
    y-=a/b*x;
    return d;
}
long long inv(long long a,long long n)
{
    long long x,y;
    long long d=ex_gcd(a,n,x,y);
    if(d==1) return (x%n+n)%n;
    else return -1;
}

 3.费马小定理求a关于mod的乘法逆元x (a<mod,a\mod互质)

long long inv_(long long a,long long m)
{
    if(a==1) return 1;
    return inv_(m%a,m)*(m-m/a)%m;
}

4.利用欧拉函数求逆元(mod为素数,且a\mod互质)

long long inv_(long long a,long long mod)
{
    return pow(a,mod-2,mod);
}

5.线性求1~MAX的逆元(MAX<mod即可)(费马小)

void inv_()
{
    inv[0]=inv[1]=1;
    for(int i=2;i<MAX;++i) inv[i]=((MOD-MOD/i)*inv[MOD%i])%MOD;
}

6.处理阶乘的逆元

逆元是完全积性函数,可由3,4,递推

DU6333 Problem B. Harvest of Apples 莫队算法+乘法逆元

HDU3037 Saving Beans Lucas 定理+逆元

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值