逆元模板总结

本文介绍了乘法逆元的概念,强调在模m操作下,a的逆元仅当a与m互质时存在,可以通过扩展欧几里德算法求解。同时提供了kuangbin神给出的逆元模板,包括基于费马小定理的 Pow(x, MOD-2) 方法,以及另一种O(n)时间复杂度的求逆方法。" 98479256,7787705,监听Android应用安装删除覆盖安装广播,"['Android开发', '广播接收器', '应用监控']

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

以前一直在用逆元,没想到今天用模板卡了,还是对概念了解的不够。今天在kuangbin神的指导下,稍稍懂了一点。

逆元:

定义 对a∈Zm,存在b∈Zm,使得a+b ≡ 0 (mod m),则b是a的 加法逆元,记b= - a。
定义 对a∈Zm,存在b∈Zm,使得a×b ≡1 (mod m),则称b为a的 乘法逆元
我们通常所指的是乘法逆元。

然而乘法逆元的应用也需要条件:

对于乘法逆元:在mod m的操作下(即Zm中),a存在乘法逆元当且仅当a与m互质不定方程ab+mx=1的任意一组整数解(b,x),b就是a的乘法逆元。具体计算可以使用扩展欧几里德算法(Extended-GCD)。

kuangbin神给的模板

//返回d=gcd(a,b);和对应于等式ax+by=d中的x,y
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;
    return d;
}
//*********求逆元素*******************
//ax = 1(mod n)
long long mod_reverse(long long a,long long n)
{
    long long x,y;
    long long d=extend_gcd(a,n,x,y);
    if(d==1) return (x%n+n)%n;
    else return -1;
}

以下两种写法都必须要求MOD为素数


1.#define Inv(x)  (Pow(x,MOD-2))

由x^(m-1) ≡ 1 (mod m)(费马小定理)

故 x* x^(m-2)≡ 1 (mod m),显然x对模m的逆元是x^(m-2)

2.还有一种写法(来源)

可以O(n)时间求逆

int[] inv = new int[MAXN];
inv[1] = 1;
for (int i = 2; i<MAXN; i++)
    inv[i] = inv[MOD%i]*(MOD-MOD/i)%MOD;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值