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

目录

快速幂

算法推导

模板

快速积


快速幂

算法推导

假设现在要求 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;
}
相关推荐
wuweijianlove6 分钟前
算法的平均复杂度建模与性能回归分析的技术7
算法·数据挖掘·回归
子琦啊10 分钟前
【算法复习】字符串 | 两个底层直觉,吃透高频题
linux·运维·算法
徐某人..1 小时前
基于i.MX6ULL平台的智能网关系统开发
arm开发·c++·单片机·qt·物联网·学习·arm
无敌秋1 小时前
# C++ 简单工厂模式实战指南
c++·简单工厂模式
code_pgf2 小时前
Octo 算法详解-开源通用机器人策略模型技术报告
算法·机器人·开源
cany10002 小时前
C++ -- 模板的声明和定义
开发语言·c++
澈2072 小时前
深耕进阶 Day1:C 与 C++ 核心差异 + C++ 入门基石
c语言·开发语言·c++
嘻嘻哈哈樱桃2 小时前
牛客经典101题题解集--动态规划
java·数据结构·python·算法·职场和发展·动态规划
脱氧核糖核酸__2 小时前
LeetCode热题100——234.回文链表(两种解法)
c++·算法·leetcode·链表