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

目录

快速幂

算法推导

模板

快速积


快速幂

算法推导

假设现在要求 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;
}
相关推荐
Zik----1 小时前
Leetcode24 —— 两两交换链表中的节点(迭代法)
数据结构·算法·链表
SmartBrain1 小时前
通俗讲解:Agent Skill和智能体的技术概念
人工智能·算法
爱喝热水的呀哈喽1 小时前
副产品技法
算法
锅包一切2 小时前
一、C++ 发展与程序创建
开发语言·c++·后端·学习·编程
!停2 小时前
数据结构二叉树—链式结构(下)
数据结构·算法
逆境不可逃2 小时前
LeetCode 热题 100 之 41.缺失的第一个正数
算法·leetcode·职场和发展
power 雀儿2 小时前
LibTorch激活函数&LayerNorm归一化
c++·人工智能
枷锁—sha2 小时前
【CTFshow-pwn系列】03_栈溢出【pwn 051】详解:C++字符串替换引发的血案与 Ret2Text
开发语言·网络·c++·笔记·安全·网络安全
666HZ6662 小时前
数据结构5.0 树与二叉树
数据结构