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

目录

快速幂

算法推导

模板

快速积


快速幂

算法推导

假设现在要求 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;
}
相关推荐
罗西的思考6 小时前
机器人 / 强化学习】HIL-SERL:人类在环驱动的具身智能进化框架
人工智能·算法·机器学习
CSharp精选营9 小时前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
美团技术团队10 小时前
LongCat 开源 VitaBench 2.0:长期动态智能体基准新标杆
人工智能·算法
用户8055336980316 小时前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
To_OC1 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC1 天前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
BadBadBad__AK1 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
卷无止境2 天前
Eigen 库如何借助 OpenMP 加速计算
c++·后端
_清歌2 天前
DSpark 深度解读:DeepSeek-V4 如何用「半自回归」把推理速度提升 85%
算法