乘法逆元【费马小定理+扩展欧几里得】

模运算性质

在这里插入图片描述

费马小定理

在这里插入图片描述
a,b互质gcd(a,b)=1

乘法逆元

a,b互质,满足a*x同余1(mod b),x是a模b的乘法逆元,记作a的-1次方。

扩展欧几里得算法

求ax+by=gcd(a,b)的一组(x,y).

随机栈

题目来源:随机栈
在这里插入图片描述
在这里插入图片描述
解题思路
想算每次拿出数的概率,就需要知道每次拿的时候有几种选择,满足条件的选择有几种,需要记录下来桟里相同的数据有多少个,可以借助优先队列和map来写。
由于这道题要取模,运用到了乘法逆元。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 998244353;
map<int, int> m;
int pow1(int a, int b) 
{
	int res = 1;
	for (; b; b >>= 1) 
	{
		if (b & 1)res = res * a % mod;
		a = a * a % mod;
	}
	return res % mod;
}
signed  main() {
	priority_queue<int, vector<int>, greater<int> > p;//小顶堆
	int n, num, l = -1, t = 0, s = 1, x = 1;
 
	cin >> n;
	for (int i = 0; i < 2 * n; i++) 
	{
		cin >> num;

		if (t != 1)
		 {
			if (num == -1) 
			{
				s = s * m[p.top()] % mod;//分子,可以选择的数字
				x = x * p.size() % mod;//分母,队列里数字个数
				if (p.top() >= l) 
				{
					l = p.top();
					m[p.top()]--;
					p.pop();
				}
				else
					t = 1;
			} 
			else 
			{
				p.push(num);
				m[num]++;
			}
		}
	}
	if (t == 1)
		cout << "0" << endl;
	else 
	{
		int ans = s * pow1(x, mod - 2) % mod;//除法取模
		cout << ans << endl;
	}

}

<think>好的,我现在需要回答用户关于如何使用费马小定理计算乘法逆元的问题。首先,我得回顾一下费马小定理的基本内容。费马小定理指出,如果p是一个质数,而a不是p的倍数,那么a的(p-1)次方模p等于1。数学表达式应该是这样的:$$a^{p-1} \equiv 1 \pmod{p}$$。 接下来,用户想知道如何用这个定理来求乘法逆元乘法逆元的定义是,对于模p下的a,存在一个数x,使得a乘以x模p等于1,也就是$$a \cdot x \equiv 1 \pmod{p}$$。结合费马小定理的话,如果p是质数,且a和p互质,那么根据定理,a^{p-1} ≡1 mod p,可以把这个式子变形为a乘以a^{p-2} ≡1 mod p。这样,a^{p-2}就是a的逆元。所以,x = a^{p-2} mod p。 接下来,我需要考虑具体的计算步骤。比如,当给定a和p时,如何快速计算a^{p-2} mod p。这时候应该使用快速幂算法,因为直接计算指数可能会非常耗时,尤其是当p很大时。快速幂通过分治的方法,将指数分解为二进制,从而降低时间复杂度到O(log p)。 然后,我需要举一个例子来具体说明这个过程。例如,取a=3,p=7。这时候,根据公式,逆元x应该是3^(7-2) mod 7,也就是3^5 mod 7。计算的话,3^5=243,243除以7得到34余5,所以x=5。验证一下,3*5=15,15 mod7=1,确实是正确的。 不过,还要注意应用条件。费马小定理只适用于p为质数的情况,而且a不能是p的倍数。如果p不是质数,或者a和p不互质,就不能用这个方法。这时候可能需要用扩展欧几里得算法来求逆元。比如,当p是合数时,费马小定理不适用,而扩展欧几里得算法可以处理更一般的情况。 此外,用户可能会问到如何处理大数情况下的计算效率,这时候需要强调快速幂的重要性。比如在编程实现时,可以使用递归或者迭代的快速幂方法来高效计算大指数模运算。同时,还要提醒用户注意可能的错误情况,比如当p不是质数或者a是p的倍数时,此时逆元不存在,应该进行错误处理。 最后,可能需要给出一个代码示例,比如用Python实现基于费马小定理逆元计算函数。代码中需要包含检查p是否为质数的步骤,以及使用快速幂计算a^(p-2) mod p。同时,要指出在实际情况中,特别是在p可能不是质数的情况下,应该使用其他方法如扩展欧几里得算法,或者更复杂的质数测试来确保正确性。 总结一下,回答的结构应该是先介绍费马小定理逆元的关系,然后给出计算步骤,接着举例说明,再讨论应用条件和限制,最后提供代码示例和相关注意事项。同时,根据用户提供的引用资料,引用中的内容可能涉及费马小定理在编程竞赛中的应用,以及逆元的相关计算方法,需要适当引用这些资料来支持回答。</think>### 使用费马小定理求解乘法逆元的方法 #### 1. **理论基础** - **费马小定理**:若 $p$ 是质数,且整数 $a$ 满足 $p \nmid a$(即 $a$ 不是 $p$ 的倍数),则: $$a^{p-1} \equiv 1 \pmod{p}$$ 进一步变形可得: $$a \cdot a^{p-2} \equiv 1 \pmod{p}$$ 因此,$a^{p-2} \bmod p$ 即为 $a$ 在模 $p$ 下的乘法逆元[^1]。 #### 2. **计算步骤** 1. **验证条件**:确保 $p$ 是质数且 $a$ 与 $p$ 互质(即 $\gcd(a, p) = 1$)。 2. **计算指数**:通过快速幂算法计算 $a^{p-2} \bmod p$,时间复杂度为 $O(\log p)$。 3. **结果验证**:检查 $a \cdot x \equiv 1 \pmod{p}$ 是否成立。 #### 3. **示例** **问题**:求 $a=3$ 在模 $p=7$ 下的乘法逆元。 **步骤**: 1. 确认 $p=7$ 是质数且 $\gcd(3,7)=1$。 2. 计算 $3^{7-2} \bmod 7 = 3^5 \bmod 7$: - $3^2 = 9 \equiv 2 \pmod{7}$ - $3^4 = (3^2)^2 \equiv 2^2 = 4 \pmod{7}$ - $3^5 = 3^4 \cdot 3 \equiv 4 \cdot 3 = 12 \equiv 5 \pmod{7}$ 3. 验证:$3 \cdot 5 = 15 \equiv 1 \pmod{7}$,结果正确。 #### 4. **代码实现(Python)** ```python def fast_pow(base, exp, mod): result = 1 while exp > 0: if exp % 2 == 1: result = (result * base) % mod base = (base * base) % mod exp = exp // 2 return result def mod_inverse_fermat(a, p): if not (is_prime(p) and gcd(a, p) == 1): # 需自行实现质数判断和gcd函数 raise ValueError("p必须是质数且a与p互质") return fast_pow(a, p-2, p) # 示例:计算3在模7下的逆元 a = 3 p = 7 inv = mod_inverse_fermat(a, p) print(f"{a}在模{p}下的逆元是{inv}") # 输出:3在模7下的逆元是5 ``` #### 5. **注意事项** - **适用范围**:仅当 $p$ 是质数且 $a$ 与 $p$ 互质时有效[^4]。 - **大数处理**:快速幂算法能高效计算大指数模运算。 - **可靠性**:若 $p$ 可能为合数,需改用扩展欧几里得算法[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值