多种求逆元的方法(递推,费马小定理,exgcd)(附exgcd讲解)

本文介绍了三种求模逆元的方法:递推法适用于求1~n的逆元,费马小定理在模数为质数时有效,而拓展欧几里得算法对模数无特定要求。通过引理证明逆元的唯一性,并提供了每种方法的详细代码实现。

逆元简介:

已知a,b(gcd(a,b)=1)a, b(gcd(a, b) = 1)a,b(gcd(a,b)=1)对于
a∗x≡1(mod b)a*x \equiv 1 (mod ~b)ax1(mod b)
我们称 xxxaaabbb 意义下的逆元, 记做a−1a^{-1}a1,逆元常常用于模意义下的除法。

引理:aaa(0,b](0,b](0,b] 的逆元 xxx 唯一
证明

反证法:设yyy也为aaa的逆元(0&lt;y&lt;b)(0&lt;y&lt;b)(0<y<b), 即a∗y≡1(mod  b)a*y \equiv 1 (mod ~~b)ay1(mod  b),不妨令 y&gt;xy &gt; xy>x
于是有a∗(y−x)≡0(mod  b)a*(y-x)\equiv 0(mod~~b)a(yx)0(mod  b),因为gcd(a,b)=1gcd(a,b) = 1gc

### 3.5 数学推导型编程题推荐(不依赖费马小定理求逆元) 在洛谷平台上,有一些题目并不直接使用费马小定理求逆元,而是需要通过数学推导、代数变换或组合恒等式来优化模运算中的除法问题。这些题目往往要求对模运算、组合数学或递推关系有较深入的理解。 #### 洛谷 P1375 小猫 该题涉及卡特兰数的递推公式: $$ C_n = \frac{4n - 2}{n + 1} \cdot C_{n-1} $$ 由于每一步都需要进行除法操作,而模运算中不能直接除法,因此需要将除法转换为乘法逆元的形式。虽然可以使用费马小定理计算逆元,但也可以通过预处理的方式避免频繁调用快速幂函数[^3]。例如,在递推过程中维护当前项与分母的对应关系,利用代数技巧减少重复计算。 ```cpp long long fast_pow(long long a, long long b, long long p) { long long ans = 1; a %= p; while (b) { if (b & 1) ans = ans * a % p; a = a * a % p; b >>= 1; } return ans; } int main() { const long long mod = 1e9 + 7; int n; cin >> n; long long ans = 1; for (int i = 1; i <= n; ++i) { ans = ans * (4 * i - 2) % mod; ans = ans * fast_pow(i + 1, mod - 2, mod) % mod; } cout << ans << endl; } ``` 尽管代码中使用了快速幂结合费马小定理求逆元,但核心思想是基于数学推导实现递推式的模运算转化。 #### 洛谷 P1313 计算系数 该题要求计算二项式展开中某一项的系数,并对结果取模。其核心在于组合数 $ C_n^k $ 的计算。虽然可以通过阶乘及其逆元加速计算,但也可以采用递推组合数的方式避免使用费马小定理: $$ C(n, k) = C(n-1, k-1) + C(n-1, k) $$ 这种方法适用于模数不是质数的情况,且能有效避免除法问题。具体实现如下: ```cpp #include <iostream> using namespace std; const int MAXN = 1005; const int MOD = 10007; int c[MAXN][MAXN]; int main() { for(int i = 0; i <= 1000; ++i) { c[i][0] = 1; for(int j = 1; j <= i; ++j) c[i][j] = (c[i-1][j-1] + c[i-1][j]) % MOD; } int a, b, n, k; cin >> a >> b >> n >> k; cout << (c[n][k] * pow(a, k, MOD) % MOD) * pow(b, n - k, MOD) % MOD << endl; return 0; } ``` 此方法完全依靠组合数的定义和递推关系,无需使用费马小定理求逆元。 #### 洛谷 P2616 [USACO11NOV] Cow Beauty Pageant G 该题是一个典型的图论题,要求在二维网格中找出若干个连通块并判断它们是否可以通过移动合并。虽然不涉及模运算或组合数学,但其解法依赖于深度优先搜索(DFS)或广度优先搜索(BFS)的数学建模能力。此类题目强调逻辑推理和状态建模,而非数值计算。 #### 洛谷 P1072 Hankson 的趣味题 该题要求求解满足条件的整数 $ x $ 的个数,其中 $ x $ 满足 $ \gcd(x, a_0) = a_1 $ 且 $ \text{lcm}(x, b_0) = b_1 $。此问题的核心在于理解最大公约数与最小公倍数的关系,并通过因数分解和枚举因子的方法解决。它不依赖于费马小定理,而是需要较强的数论推导能力。 ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值