快速幂求逆元

思路

题意:

给出两个整数 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;
}
相关推荐
郝学胜-神的一滴1 小时前
Qt 高级开发 009: C++ Lambda 表达式
开发语言·c++·qt·软件构建
石山代码2 小时前
C++ 轻量级日志系统
开发语言·c++
smj2302_796826524 小时前
解决leetcode第3943题递增后的数对数量
数据结构·python·算法·leetcode
炽烈小老头5 小时前
【每天学习一点算法 2026/05/25】矩阵中的最长递增路径
学习·算法·矩阵
王老师青少年编程5 小时前
2026年全国青少年信息素养大赛初赛真题(算法应用主题赛C++初中组初赛真题3:文末附答案和解析)
c++·真题·答案·初赛·2026年·青少年信息素养大赛·初中组
轻颂呀6 小时前
C++11——并发库介绍
开发语言·c++
叁散6 小时前
实验报告:5G 仿真环境与基本链路模拟
算法
从负无穷开始的三次元代码生活6 小时前
算法零碎灵感点分享
算法
梓䈑7 小时前
【算法题攻略】快速排序 和 归并排序
数据结构·c++·排序算法
染指11107 小时前
9.LangChain框架(实现RAG)
数据库·人工智能·算法·机器学习·ai·大模型