快速幂求逆元

思路

题意:

给出两个整数 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;
}
相关推荐
CVer儿8 分钟前
svd分解求旋转平移矩阵
线性代数·算法·矩阵
Owen_Q16 分钟前
Denso Create Programming Contest 2025(AtCoder Beginner Contest 413)
开发语言·算法·职场和发展
视觉人机器视觉1 小时前
Visual Studio2022和C++opencv的配置保姆级教程
c++·opencv·visual studio
liulilittle1 小时前
C++ i386/AMD64平台汇编指令对齐长度获取实现
c语言·开发语言·汇编·c++
Wilber的技术分享1 小时前
【机器学习实战笔记 14】集成学习:XGBoost算法(一) 原理简介与快速应用
人工智能·笔记·算法·随机森林·机器学习·集成学习·xgboost
Tanecious.2 小时前
LeetCode 876. 链表的中间结点
算法·leetcode·链表
Wo3Shi4七2 小时前
哈希冲突
数据结构·算法·go
呆呆的小鳄鱼2 小时前
cin,cin.get()等异同点[面试题系列]
java·算法·面试
Touper.2 小时前
JavaSE -- 泛型详细介绍
java·开发语言·算法
sun0077002 小时前
std::forward作用
开发语言·c++·算法