当前位置: 首页 > news >正文

倍增法

引入

对于任意的整数n,都可以将他拆分为有限个二次幂的和(即二进制拆分)。

那么我们就可以将规模为n的大问题拆分为许多区间长度为二的幂次的小问题。

这样,如何快速解决区间长度为二的幂次的问题就是我们想关心的。

这就是倍增法想解决的问题。

倍增法快速幂

倍增法快速幂的解决的经典问题就是求a^x(mod p)

分析

我们将x二进制拆分为 x0+x1+x2+...+xn,其中xi为二的幂次

现在我们关心如何快速求出a^( 2^i ),将上式记为fi,显然fi=f(i-1) * f(i-1)。

现在我们有一个朴素的想法:

f0=1,f1=a;
for i:=1 to [log x]
|	fi=f(i-1) * f(i-1);
end;
ans:=1;
for i:=1 to [log x]
| 	if 2^i存在于x的二进制拆分序列{xi}中
|	|ans=ans*fi;
|	end
end;
print(ans);

现在我们的问题是如何快速判断 \(2^i\)是否存在于{xi}中。其实这并不困难,利用位运算,只需(x^(1<<i))为1即可说明 \(2^i\) 在{xi}中。
我们容易将完整代码给出。

问题

给出一个数组a,q次询问,每次输入l,r,输出al-ar中的最大值。

我们已经介绍了如何拆分长度为x的区间问题。我们来看怎么预处理出长度为2^i 的区间最值。

设fi,p 表示以 p 为左端点,长度为2i 的区间的最大值。

由2^i =2×(2^i−1) 这个式子。长度为 2^i 的区间可以拆成两个长度为2i−1 小区间,第一个区间的端点为p,第二个区间的端点为p+2i−1。
于是得到递推式:fi,p=max(fi−1,p,fi−1,p+2i−1)。

像这样预处理f数组后,我们可以像引言中介绍的那样将问题进行二进制拆分,每次询问的时间复杂度为O(log n)。
能不能做到更快?

不难注意到,如果两个区间有重合是不影响最终结果的,于是对于区间[l,r]最值,我们可以返回以l为左端点的区间最值和以r为右端点的区间最值的max作为回答。
这样 时间复杂度就被降低到了O(1)。

硬是要总结

本文介绍算法思想的核心是将规模为n的问题通过二进制拆分为一个个小问题,通过快速解决小问题以达到解决大问题。

http://www.gsyq.cn/news/21849.html

相关文章:

  • 鸿蒙NEXT Wi-Fi扫描编写指南:从基础到实战
  • 251015读书报告
  • 元推理框架的诞生,是绝对真实的证明,彻底击溃虚无论
  • 吴恩达深度学习课程一:神经网络和深度学习 第二周:神经网络基础 课后习题和代码实践
  • 蛋白表达标签:提升重组蛋白研究与生产的关键工具
  • Zhengrui #3346. DINO
  • Pytorch深度学习训练
  • P11894 「LAOI-9」Update
  • win10软实时设置 - 教程
  • 实用指南:Hunyuan3D-Omni:可控3D资产生成的统一框架
  • ZR 2025 NOIP 二十连测 Day 3
  • P66实训题
  • 非主流网站程序IndexNow添加方法
  • 卷积神经网络视频读书报告
  • 以*this返回局部对象的两种情况
  • 2025.10.15
  • Kali 自定义ISO镜像
  • pytorch实训题
  • 【Azure App Service】App Service是否支持PHP的版本选择呢?
  • Markdown转换为Word:Pandoc模板使用指南 - 实践
  • 复习CSharp
  • C语言学习——运算符的学习
  • 实用指南:NXP - 用MCUXpresso IDE v25.6.136的工具链编译Smoothieware固件工程
  • cifar10
  • 感知节点@4@ ESP32+arduino+ 第二个程序 LED灯显示
  • WebGL学习及项目实战(第02期:绘制一个点)
  • display ip routing-table protocol ospf 概念及题目 - 详解
  • C语言学习——小数数据类型
  • 高敏感人应对焦虑
  • 2025 年执业兽医资格证备考服务机构推荐榜,执业兽医资格证培训机构/执兽考试机构/考试辅导机构获得行业推荐