【算法】倍增思想(快速幂)

目录

快速幂

算法推导

模板

快速积


快速幂

算法推导

假设现在要求 a^b,我们可以用一个 for 循环循环 b 次累乘出结果,还可以用快速幂的方法,假设 b == 11:

即:先写出 b 的二进制表示,如果 b 的二进制表示的某一位是 1,就累乘上 a 的该位置二进制位权次方

模板

cpp 复制代码
#include <iostream>
using namespace std;
typedef long long LL;
LL qpow(LL a, LL b, LL p)
{
	LL ret = 1;
	while (b)
	{
		if (b & 1) ret = ret * a % p; // 处处取模防止溢出
		a = a * a % p;
		b = b >> 1;
	}

	return ret;
}
LL a, b, p;

int main()
{
	cin >> a >> b >> p;
	printf("%lld^%lld mod %lld=%lld", a, b, p, qpow(a, b, p));
	return 0;
}

快速积

现在要求 a*b % p ,但 1 ≤ a,b,p ≤ 10^18,即 a 如果直接乘 b,结果会溢出,可以使用 for 循环循环 b 次累加 a,也可以使用快速积:

cpp 复制代码
#include <iostream>
using namespace std;
typedef long long LL;
LL qmul(LL a, LL b, LL p)
{
	LL ret = 0;
	while (b)
	{
		if (b & 1) ret = (ret + a) % p; // 处处取模防止溢出
		a = (a + a) % p;
		b = b >> 1;
	}

	return ret;
}
LL a, b, p;

int main()
{
	cin >> a >> b >> p;
	printf("%lld",qmul(a, b, p));
	return 0;
}
相关推荐
Gigavision3 小时前
基于BUAA-MIHR数据集的噪声解耦对比学习算法
人工智能·python·深度学习·算法
鹿角片ljp3 小时前
LeetCode 64:最小路径和复盘|二维 DP 与 ACM 模式完整写法
java·数据结构·算法
彧azz4 小时前
算法设计与分析:贪心与动态规划
数据结构·学习·算法·贪心算法·动态规划
Beyond_System|系统之外5 小时前
【学编程】Python基础编程题100道(21-60)
开发语言·python·算法
景熙55235 小时前
15.Java 8 Stream 流入门到实战
java·开发语言·数据结构
汉克老师6 小时前
GESP2026年9月认证C++六级( 第三部分编程题(1、数组划分))精讲
c++·gesp·小学生·学c++编程
千里码aicood6 小时前
基于PLC与机器视觉的智能分拣控制系统设计
c++·自动化·plc
漂流瓶jz7 小时前
UVA-1442 洞穴 题解答案代码 算法竞赛入门经典第二版
c++·算法·题解·aoapc·算法竞赛入门经典·uva
朽棘不雕7 小时前
进一步了解模板
c++
叠层归一研究院8 小时前
基于极限自指的叠层归一宇宙结构理论——无元外部封闭系统的内生区分模型
人工智能·经验分享·算法·agi