「学习笔记」逆元
定义#
如果一个线性同余方程 ,则 称为 的逆元,记作 。
如何求逆元#
利用费马小定理#
前置知识:费马小定理。
如果 是质数,那么 ,即 ,逆元 。
我们可以用快速幂来实现。
快速幂代码:
ll qpow(ll x, ll y, ll mod) {
ll res = 1;
while (y) {
if (y & 1) {
res = res * x % mod;
}
y >>= 1;
x = x * x % mod;
}
return res % mod;
}
利用扩展欧几里得算法#
前置知识:扩展欧几里得算法。
利用扩展欧几里得算法求解,就是解不定方程 。
接下来按照扩展欧几里得算法解不定方程来做就行了。
的有解的要求是 是 的倍数,因此欧几里得算法求逆元的要求是 。
扩展欧几里得算法的代码如下:
int exgcd(int a, int b, int& x, int& y) {
if (!b) {
x = 1, y = 0;
return a;
}
int g = exgcd(b, a % b, y, x);
y -= (a / b) * x;
return g;
}
线性求逆元#
的逆元为 ,这是我们推算其他数的逆元的基础。
对于一个模数 ,我们设 ,则 ,在 意义下,,移项得 ,同余式两边同乘 得 ,将 得 ,我们可以用 来代替 这个负数。
最后的递推公式:
代码:
#define rep(i, a, b, c) for (int i = (a); i <= (b); i += (c))
#define per(i, a, b, c) for (int i = (a); i >= (b); i -= (c))
const int N = 3e6 + 5;
int n, p;
ll inv[N];
int main() {
n = read<int>(), p = read<int>();
inv[1] = 1;
rep (i, 2, n, 1) {
inv[i] = 1ll * (p - (p / i)) * inv[p % i] % p;
}
rep (i, 1, n, 1) {
cout << inv[i] << '\n';
}
return 0;
}
线性求任意 n 个数的逆元#
给定任意 个数,要求线性时间复杂度求出这 个数的逆元。
先预处理出前 个数的前缀积 ,随后处理出 的逆元 ,即 , 的逆元 ,这样就能线性求出任意 个数的逆元了。
#define rep(i, a, b, c) for (int i = (a); i <= (b); i += (c))
#define per(i, a, b, c) for (int i = (a); i >= (b); i -= (c))
rep (i, 1, n, 1) {
s[i] = read<ll>();
}
pro[0] = 1;
rep (i, 1, n, 1) {
pro[i] = pro[i - 1] * s[i] % mod;
}
inv[n] = qpow(pro[n], mod - 2);
per (i, n, 1, 1) {
inv[i - 1] = inv[i] * s[i] % mod;
}
rep (i, 2, n, 1) {
inv[i] = inv[i] * pro[i - 1] % mod;
}
线性求阶乘的逆元#
阶乘计算公式:,
与上面“线性求任意 个数的逆元”一样的道理,先预处理出阶乘 ,随后我们算出 的逆元 ,然后可以通过倒叙枚举来求出每个阶乘的逆元。
#define rep(i, a, b, c) for (int i = (a); i <= (b); i += (c))
#define per(i, a, b, c) for (int i = (a); i >= (b); i -= (c))
fac[0] = 1;
rep (i, 1, n, 1) {
fac[i] = fac[i - 1] * i % mod;
}
inv[n] = qpow(fac[n], mod - 2);
per (i, n, 1, 1) {
inv[i - 1] = inv[i] * i % mod;
}
作者:yifan0305
出处:https://www.cnblogs.com/yifan0305/p/17665436.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
转载时还请标明出处哟!
朝气蓬勃 后生可畏
分类:
数学知识
Buy me a cup of coffee ☕.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具