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

目录

快速幂

算法推导

模板

快速积


快速幂

算法推导

假设现在要求 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;
}
相关推荐
丘山望岳1 小时前
单调栈和单调队列
数据结构
Fuyo_11191 小时前
C++ AVL树保姆级详解:从平衡因子到四大旋转机制
java·c++·算法
jktantan2 小时前
每个节点 41 字节:把一棵百万节点树拆进 14 个 typed array
前端·javascript·vue.js·算法·typescript
揽星河..2 小时前
【C语言】猜数字游戏
c语言·算法·游戏
傲世仙尊3 小时前
继承-类设计层次复用切片转换与菱形继承的死结
c++
架构师伯子明3 小时前
FFmpeg C++学习(一):编译和demo
开发语言·c++·学习
LabVIEW开发3 小时前
CTM-3 红外测温仪 + LabVIEW 温度怎么测?
算法·labview·测试·labview程序
纪念 2293 小时前
C++算法(六)
开发语言·c++·算法
ShineWinsu3 小时前
对于Qt:QCheckBox常见属性的详细解析
c++·qt·面试·笔试·gui·qcheckbox·多选框
Dumbness4 小时前
UIA 读微信群消息没有 id,怎么判断哪条是新的:后缀对齐在翻历史和撤回时整屏重报
python·算法