【快速幂算法】考一次忘一次,这六到爆的方法不能再忘了。

最近在准备蓝桥杯,进程遇到算法超时的问题,很多时候都是拿快速幂进行一个优化的,比如下面这道题:

我们将问题提取出来,这就是一道计算 a^b 值的题目,那么问题来了,如何计算a^b?下面先讲一下普通幂算法的操作,再引出快速幂算法。

普通幂算法

我们在计算的 a^n 的时候,其实就是n个a相乘,那么我们就是需要遍历n遍,时间复杂度就是O(n)。别想着这不是很简单?其实当n值较小的时候,并没有很大的区别,但是当n值特别大时,这计算时间就得"等到天黑了"。 而采用快速幂算法就不一样了

看这个遍历次数就有质的减少。下面我们就详细的说说普通幂算法与快速幂算法之间的区别。

快速幂算法

分类情况

当n为2的幂时

比如n = 64 其实就是使用了倍增原理,最后时间复杂就由原来的O(n) 变成了 O(logn):

当n不为2的幂

比如n = 105 我们可以将105拆分成多个2的幂的和,105 = 1 + 8 + 32 + 64,那么我们就可以转换成:

接下来说一下代码

代码解析

下面是段伪代码:(大家可以看b站那个,讲的是真的好,资料在下面)

  • 第一部分: 遍历多少次其实就与这个n有关,我们将n转换成二进制,二进制的长度就是遍历的次数,每一次遍历完成就除2
  • 第二部分: 主要就为了记录一下(我理解的是记录)a在每次遍历完后的值,
  • 第三部分: 计算幂,当二进制的结尾为1时,我们就将之前记录的a进行相乘。

最后我们可以将代码转换成位与运算:

快速幂算法的应用

快速幂取模

计算a^n mod m

计算斐波那契数列第n项

斐波那契数列是我们学习递归的一个典型案例,什么是斐波那契数列呢:下面的队列就是:【0,1,1,2,3,5,8,13,21,34,。。】其规律就是f(n) = f(n-1)+f(n-2); 那么我们怎么使用快速幂解决呢?

将线性变换重复n次 (暂未明白)

练一练

java 复制代码
package 蓝桥杯2023;

import java.util.Scanner;

/**
 * 有多少个x 与 a^b 互为质数
 * 结果取模998244353 
 * 
 * 输入 a b 
 * @author colir
 *
 */
public class 互质数的个数 {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		long a = scanner.nextLong();
		long b = scanner.nextLong();
		scanner.close();
		long res = eulerFunction(a);
		res = (res*fastpow(a, b-1)) % 998244353;
		System.out.println(res);
	}
	// 计算互质的个数------ 欧拉函数
	private static long eulerFunction(long a) {
		long res = a;
		for (int i = 2; i <= a/i; i++) {
			if (a % i == 0) {
				res = res / i * (i-1);
				while (a % i ==0) {
					a /= i;
				}
			}
		}
		if (a > 1) {
			res = res / a * (a-1);
		}
		return res;
	}
	// 快速幂算法
	private static long fastpow(long a,long b) {
		long res = 1;
		while(b > 0) {
			if ((b & 1) > 0) {
				res = (res * a) % 998244353;
			}
			a = (a * a) % 998244353;
			b >>=  1;
		}
		return res;
	}
}

资料

笔记来源:

相关推荐
程序员东岸1 小时前
《数据结构——排序(中)》选择与交换的艺术:从直接选择到堆排序的性能跃迁
数据结构·笔记·算法·leetcode·排序算法
程序员-King.1 小时前
day104—对向双指针—接雨水(LeetCode-42)
算法·贪心算法
神仙别闹2 小时前
基于C++实现(控制台)应用递推法完成经典型算法的应用
开发语言·c++·算法
Ayanami_Reii2 小时前
进阶数据结构应用-一个简单的整数问题2(线段树解法)
数据结构·算法·线段树·延迟标记
listhi5202 小时前
基于改进SET的时频分析MATLAB实现
开发语言·算法·matlab
Keep_Trying_Go3 小时前
基于Zero-Shot的目标计数算法详解(Open-world Text-specified Object Counting)
人工智能·pytorch·python·算法·多模态·目标统计
xl.liu3 小时前
零售行业仓库商品数据标记
算法·零售
confiself3 小时前
通义灵码分析ms-swift框架中CHORD算法实现
开发语言·算法·swift
做怪小疯子3 小时前
LeetCode 热题 100——二叉树——二叉树的层序遍历&将有序数组转换为二叉搜索树
算法·leetcode·职场和发展
CoderYanger4 小时前
递归、搜索与回溯-记忆化搜索:38.最长递增子序列
java·算法·leetcode·1024程序员节