逆元 学习笔记

定义&&作用

如果 ax1(modb) 并且 gcd(a,b)=1 那么我们称 xamodb 的逆元,记做 a1 或者是 1a
这样我们就可以求出任意实数 ab 在模 p 意义下的值了(通常 p 是质数)。

求逆元

这里求的是在模 p 意义下的 a1 的值。

快速幂

不难得出 x=ap2modp 用快速幂做即可,复杂度 O(log2p)
证明如下:
法一:费马小定理
因为 p 是素数并且 gcd(a,p)=1
所以 ap11(modp)
所以 a×ap21(modp)
所以 x=ap2modp.
法二:欧拉定理
因为 gcd(a,p)=1
所以 aφ(p)1(modp)
因为 p 是素数,所以 φ(p)=p1
所以 ap11(modp)
所以 a×ap21(modp)
所以 x=ap2modp.

int pow(int x,int y){
ll res=1,tmp=x;
while(y>0){
if(y&1) res=res*tmp%p;
tmp=tmp*tmp%p;
y>>=1;
}
return res%p;
}
int js(int a,int p){// a^-1%p
return pow(a,p-2);
}

exgcd

根据定义 ax1(modp) 并且 gcd(a,p)=1
我们发现满足 ax+py=gcd(a,p)=1
exgcd即可,不会的点这里

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

线性求逆元

题目传送门
题目大意:给定 n,p1n 中所有整数在模 p 意义下的乘法逆元。
显然直接一个一个求是不可能的,这里介绍如何线性求(算法复杂度 O(n) )。
首先 111(modp)
我们设 p=aq+r,0r<a
那么 q=pa,r=pmoda 并且 aq+r0(modp)
移项,得 raq(modp)
等式两边同时乘上 r1a1 , 得到 a1q×r1(modp)
所以 a1pa×(pmoda)(modp)
开个数组 invi 代表 i1 即可。

int inv[maxn];//inv[i]->i^-1(mod p)
void solve(){
inv[0]=0; inv[1]=1;
for(int i=2;i<=n;i++)//long long
inv[i]=(ll)(p-p/i)*(ll)inv[p%i]%p;
for(int i=1;i<=n;i++)
printf("%d\n",inv[i]);
}

阶乘逆元线性求

显然我们发现 1a!a+1(a+1)!(modp)
所以 a!1(a+1)!1×(i+1)(modp)
我们只要求出 n!1 就可以求出 1!1,2!1,,(n1)!1 了。
算法复杂度 O(n)

END.

posted @   jiangtaizhe001  阅读(82)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示