快速幂求逆元

思路

题意:

给出两个整数 a , p a,p a,p,其中 p p p 是质数,求出一个整数 b b b,使得 a ∗ b = 1 ( m o d p ) a~*~b~=~1(mod~p) a ∗ b = 1(mod p) 成立(即求 a a a 模 p p p 的乘法逆元)。

首先我们需要记住费马小定理 :若 p p p 为质数且 a m o d p ! = 0 a~mod~p~!=~0 a mod p != 0,那么式子 a p − 1 = 1 ( m o d p ) a^{p-1}~=~1(mod~p) ap−1 = 1(mod p) 成立。

我们可以把这个式子转化为 p ∗ a p − 2 = 1 ( m o d p ) p~*~a^{p-2}~=~1(mod~p) p ∗ ap−2 = 1(mod p)。

那么易知:

当 a m o d p ! = 0 a~mod~p~!=~0 a mod p != 0 时,需要求的乘法逆元 b b b 的值等于 a p − 2 a^{p-2} ap−2;当 a m o d p = 0 a~mod~p~=~0 a mod p = 0 时,乘法逆元不存在。

C o d e Code Code

cpp 复制代码
#include <bits/stdc++.h>
#define int long long
#define sz(a) ((int)a.size())
#define all(a) a.begin(), a.end()
using namespace std;
using PII = pair<int, int>;
using i128 = __int128;
const int N = 2e5 + 10;

int qpow(int a, int b, int p) {
	int res = 1;
	while (b) {
		if (b & 1) {
			res = res * a % p;
		}
		a = a * a % p;
		b >>= 1;
	}
	return res;
}

signed main() {
	int a, p;
	cin >> a >> p;
	if (p >= 2 && a % p) {
		cout << qpow(a, p - 2, p) << "\n";
	} else {
		cout << "impossible\n";
	}
	return 0;
}
相关推荐
汉克老师4 分钟前
2026年CSP-J初赛分数线-----预测
c++·csp-j·小学生·学c++编程
Lumos18630 分钟前
51单片机从零到实战(完结)——后续学习路线建议
算法
稚南城才子,乌衣巷风流35 分钟前
DFS序详解:原理、应用与实现
算法·深度优先·图论
稚南城才子,乌衣巷风流40 分钟前
动态树(Dynamic Tree)数据结构详解
数据结构·算法
小保CPP44 分钟前
OpenCV C++将多张图像合并为webp动图
c++·人工智能·opencv·计算机视觉
乐观勇敢坚强的老彭2 小时前
信奥C++一维数组笔记
开发语言·c++·笔记
码上有光2 小时前
异常和智能指针
java·大数据·c++·servlet·异常·智能指针
变量未定义~2 小时前
最小生成树1(Prim模板)、最小生成树2(kruskal模板)、最近公共祖先(模板)
算法
这就是佬们吗2 小时前
Python入门⑤-异常处理、文件操作与实战项目
开发语言·数据库·python·算法·pycharm
王维同学2 小时前
[原创][Windows C++]Explorer Shell 扩展、图标覆盖与 COM 服务器定位
c++·windows·注册表