算法笔记【乘法逆元】


这里主要讨论算法竞赛中除法取模的问题,不涉及到其他数学项目。
文章参考: 知乎博主:Grandeur

什么是乘法逆元

乘法逆元就是我们在初中所学到的倒数
就比如,a的乘法逆元就是 1 a \frac{1}{a} a1,
如果设a的乘法逆元为x,那么 a × x = 1 a \times x = 1 a×x=1

为什么会有乘法逆元

在算法竞赛中,常常会涉及到很大的数字,往往会对其取模,在进行取模运算中一般可以用同余的概念,但并不都适用,对于数学运算中的乘法、加法、减法都有同余取模的概念,但对于除法就没这个概念了

比如: 8 × 4 / 4 % 5 8 \times 4 / 4 \% 5 8×4/4%5
如果直接计算的话, 32 / 4 % 5 = 8 % 5 = 3 32/4\%5 = 8\%5 = 3 32/4%5=8%5=3
那如果通过取模运算的话,就为 32 % 5 4 % 5 = 2 4 \frac{32 \% 5}{4 \% 5} = \frac{2}{4} 4%532%5=42
所取得的值就不一样

乘法逆元的理解

那么为了解决除法没有同余取模这个概念的问题,那么我们就可以将 1 4 \frac{1}{4} 41替换掉,比如 4 × x % 5 = 1 4 \times x \% 5 = 1 4×x%5=1,那么 x % 5 = 1 4 x \%5 = \frac{1}{4} x%5=41,那么求出x的值就可以进行平替 1 4 \frac{1}{4} 41这个问题,将除法变为乘法。

乘法逆元代码介绍

对于乘法逆元的计算,这里先介绍一个定理(当然这里不只这一个求法,这里介绍比较简答的方法)
费马小定理

费马小定理:对于整数a与质数b,若 a 与 b 互质,则有:
a b − 1 m o d b ≡ 1 a^{b-1} \quad mod\quad b \equiv 1 ab1modb1
进行变形为
a × a b − 2 m o d b ≡ 1 a \times a ^ {b-2} \quad mod\quad b \equiv 1 a×ab2modb1
那么可以得出
如果 b 的质数的话,那么 a b − 2 是 a 的乘法逆元 如果b的质数的话,那么a^{b-2}是a的乘法逆元 如果b的质数的话,那么ab2a的乘法逆元

那么我们就可以通过计算 a b − 2 a^{b-2} ab2 来进行计算a的乘法逆元。
但对于算法竞赛的话,b的值一般都是比较大的素数,那么要计算 a b − 2 a^{b-2} ab2 就需要用快速幂来进行计算。
快速幂的代码:

int quick_mi(int a,int b)
{
    int ans = 1;
    while(b)
    {
        while(b % 2 == 0)
        {
            a = a * a % mod;
            b = b / 2;
        }
        ans = ans * a % mod;
        b = b - 1;
    }
    return ans ;
}

那么整个计算方法就为

#include<iostream>
using namespace std;
const long long mod = 998244353;

long long quick_mi(long long a,long long b)
{
    long long ans = 1;
    while(b)
    {
        while(b % 2 == 0)
        {
            a = a * a % mod;
            b = b / 2;
        }
        ans = ans * a % mod;
        b = b - 1;
    }
    return ans;
}

int main(void)
{
	long long a,b;
	cin >> a >> b;
	cout << a << "的乘法逆元的值就为:" << quick_mi(a,b-2) << endl;
	return 0;
}
  • 这个是先介绍的是直接求乘法逆元,那么遇到求一段内的所有数字的乘法逆元的方法就需要用到打表了。

代码:

int inv[mod + 10];
void GetInv(int mod)
{
    inv[1] = 1;
    for(int i = 2; i < mod; i ++)
        inv[i] = 1LL * (mod - mod / i) * inv[mod % i] % mod;
}

这个代码比较难理解,这里只需要记住就好了,有兴趣的读者可以去上述博客中自行理解,这里就不多解释了。

乘法逆元的相关例题

蓝桥杯 3522-互质数的个数

  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值