这里以一道求乘法逆元的模板题(【洛谷3811】【模板】乘法逆元)为例,来讲一讲求一个数乘法逆元的三种经典解法。
解法一:快速幂
证明: 费马小定理。由费马小定理 a p − 1 ≡ 1 ( m o d a^{p-1}≡1(mod ap−1≡1(mod p ) p) p)可得, a ∗ a p − 2 ≡ 1 ( m o d a*a^{p-2}≡1(mod a∗ap−2≡1(mod p ) p) p),显然,我们可以发现 a p − 2 a^{p-2} ap−2就是 a a a在模 p p p意义下的逆元。只要用快速幂就可以快速求出。
L i n k Link Link
快速幂详见博客快速幂算法详解
费马小定理详见博客筛素数方法(二)—— 费马小定理及MR素数判断
代码:
#include<bits/stdc++.h>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define LL long long
#define swap(x,y) (x^=y,y^=x,x^=y)
using namespace std;
int n,m;
inline char tc()
{
static char ff[100000],*A=ff,*B=ff;
return A==B&&(B=(A=ff)+fread(ff,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0;int f=1;char ch;
while(!isdigit(ch=tc())) f=ch^'-'?1:-1;
while(x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
x*=f;
}
inline void write(int x)
{
if(x<0) putchar(