题目链接

求逆元的三种方式:

1.扩欧

i*x≡1 (mod p)

可以化为:x*i+y*p=1

exgcd求x即可

inline void exgcd(int a,int b,int &x,int &y){
    if(b==0){
        x=1; y=0;
        return;
    }
    exgcd(b,a%b,x,y);
    int t=x;
    x=y;
    y=t-(a/b)*y;
}

 

2.快速幂

费马小定理:a^(p-1) ≡ 1 (mod p)

a*a^(p-2)≡1(mod p)

x=a^(p-2) 即为逆元

inline int qpow(int x,int k){
    int s=1;
    while(k){
        if(k&1) s=s*x%p;
        k>>=1;
        x=x*x%p;
    }
    return s;
}

 

3.线性递推:

inv[i]=(M-M/i)*inv[M%i]%M;

证明:
设t=M/i,k=M mod i
t*i+k≡0(mod M)
t*i≡-k(mod M)
两边同时乘以k和i的逆元:t*inv[k]≡-inv[i](mod M)
inv[i]≡-t*inv[k](mod M)
将t和k用M和i表示:
inv[i]≡(-M/i)*inv[M mod i](mod M)
 

 

inv[1]=1;for(int i=2;i<=n;i++)
     inv[i]=(p-p/i)*inv[p%i]%p;

 

相关文章:

  • 2021-08-16
  • 2021-07-06
  • 2021-10-23
  • 2021-11-06
  • 2021-06-24
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-01-13
  • 2021-08-10
  • 2021-10-27
  • 2021-11-02
  • 2021-12-26
  • 2021-10-07
相关资源
相似解决方案