洛谷P3811 乘法逆元 (3种解法分析)

参考博客:传送门1

小记

1.本文重点是在于线性求逆元👨‍👧

2.对于求逆元,优先用扩展欧几里得,因为只要求互质,不要求是质数。

3.对于有取模的,一定要做好防爆保护(ll)

题目描述

给定n,p,求 1 ∼ n 1∼n 1n 中所有整数在模 p 意义下的乘法逆元。

基础知识

1.逆元是什么

a ∗ x ≡ 1 ( m o d   b ) a*x\equiv1 (mod\,b) ax1modb,且a与b互质,

那么x就是a在b模意义下的倒数,称x为a的逆元,记为 a − 1 a^{-1} a1

2.扩展欧几里得exgcd(a,b,x,y)

可以求出 a*x+b*y=gcd(a,b)的整数解。

是gcd的扩展,故而使用时没有条件。

3.费马小定理

若 a是正整数,b是质数,且a与b互质,那么 a b − 1 ≡ 1 ( m o d   b ) a^{b-1}\equiv1 (mod\, b) ab11(modb)

因此 a ∗ a b − 2 ≡ 1 ( m o b   b ) a* a^{b-2} \equiv1(mob\,b) aab21(mobb), 即 a的逆元是 a b − 2 a^{b-2} ab2

求逆元解法

<一>用扩展欧几里德

那么就是给 ( i ∗ x i ) % p = 1 (i*x_i)\%p=1 (ixi)%p=1 x i x_i xi,

简化一下,就是 i*x=p*y+1, 又可以转为 i*x+p*y=1,

如果i,p互质,那么就是 i*x+p*y=gcd(i,p).

而这一题,i<n<p,且p是质数,i和p互为质,故可用。

<二> 用费马小定理

题目满足(1)i和p互质; (2)p是质数。那逆元就是 i p − 2 i^{p-2} ip2

<三> 线性求逆元

🌟既然题目可以用一个线性函数描述,那么就有线性关系,

设p=k*i+r

∴ \therefore (k*i+r) %p=0

∴ r % p = ( − k ∗ i ) % p \therefore r\%p=(-k * i)\%p r%p=(ki)%p

又 在左右同乘上 i − 1 ∗ r − 1 i^{-1}* r^{-1} i1r1

∴ i − 1 % p = − k ∗ r − 1 % p \therefore i^{-1}\%p=-k * r^{-1}\%p i1%p=kr1%p

∴ i − 1 = − [ p i ] ∗ [ p % i ] − 1 \therefore i^{-1}=-[\frac{p}{i}]* [p\%i]^{-1}%p i1=[ip][p%i]1

#include "cstdio"
typedef long long ll;
const  int maxn=3e6+10;
int n,p,inv[maxn];
void solve()
{
    inv[1]=1;
    printf("%d\n",1);
    for(int i=2;i<=n;++i)
    {
        inv[i]=(((ll)(-p/i)*inv[p%i])%p+p)%p; 
        //(ll)对于要取模的,防爆装置要做好
        printf("%d\n",inv[i]);
    }
}
int  main()
{
   scanf("%d %d",&n,&p);
   solve();
    return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是Mally呀!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值