快速幂求逆元

思路

题意:

给出两个整数 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;
}
相关推荐
让我们一起加油好吗23 分钟前
【C++】模板(初阶)
开发语言·c++·visualstudio·模板·泛型编程
Run_Teenage1 小时前
C++类和对象:运行符重载、取地址运算符重载、const 修饰的类如何作为参数
开发语言·c++
一只小bit1 小时前
More Effective C++:改善编程与设计(上)
开发语言·c++·方法·技巧
强盛小灵通专卖员2 小时前
分类分割详细指标说明
人工智能·深度学习·算法·机器学习
李匠20244 小时前
C++GO语言微服务之图片、短信验证码生成及存储
开发语言·c++·微服务·golang
IT猿手6 小时前
基于强化学习 Q-learning 算法求解城市场景下无人机三维路径规划研究,提供完整MATLAB代码
神经网络·算法·matlab·人机交互·无人机·强化学习·无人机三维路径规划
万能程序员-传康Kk9 小时前
旅游推荐数据分析可视化系统算法
算法·数据分析·旅游
PXM的算法星球9 小时前
【并发编程基石】CAS无锁算法详解:原理、实现与应用场景
算法
ll7788119 小时前
C++学习之路,从0到精通的征途:继承
开发语言·数据结构·c++·学习·算法
烨然若神人~9 小时前
算法第十七天|654. 最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
算法