「乘法逆元」学习笔记
概念
若关于整数
- 当
(整除)时,不存在 的逆元 - 特别的,有
- 证明:对于整数
,有 ,故 的逆元为
- 证明:对于整数
性质
- 若
为正整数,则- 证明:已知
,设 ,又因为 为偶数, 的最小整数解为 ,代入得
- 证明:已知
- 若
为质数,且 ,则- 证明:
需要用到费马小定理,暂时不会,学了回来再写
- 证明:
求法
1.
例题:同余方程
- 时间复杂度
2.线性求 或单个数的逆元(递推/递归)
限制条件: 为质数
证明:
设
两边同时乘上
移项得
将
考虑消除负数取模对答案的影响,故推出逆元:
- 递推求
的逆元, 预处理, 查询 - 递归求任意数的逆元,时间复杂度
例题
代码如下(递推):
#include<bits/stdc++.h> #define int long long #define endl '\n' using namespace std; template<typename Tp> inline void read(Tp&x) { x=0;register bool z=1; register char c=getchar(); for(;c<'0'||c>'9';c=getchar()) if(c=='-') z=0; for(;'0'<=c&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48); x=(z?x:~x+1); } void wt(int x){if(x>9)wt(x/10);putchar((x%10)+'0');} void write(int x){if(x<0)putchar('-'),x=~x+1;wt(x);} int n,p,inv[10000010]; void niyuan(int n) { inv[1]=1; for(int i=2;i<=n;i++) inv[i]=((p-p/i)*inv[p%i])%p; } signed main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif read(n),read(p); niyuan(n); for(int i=1;i<=n;i++) write(inv[i]),puts(""); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效