Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【倍增思想】须知少年凌云志,曾许人间第一流 - 彻底解决快速幂

【倍增思想】须知少年凌云志,曾许人间第一流 - 彻底解决快速幂

作者头像
用户11369350
发布于 2025-04-01 00:57:10
发布于 2025-04-01 00:57:10
7700
代码可运行
举报
运行总次数:0
代码可运行

本篇博客给大家带来的是倍增思想的题目讲解, 利用此思想解决快速幂 和 64位整数乘法非常好用.

1. 快速幂

题目链接: P1226 【模板】快速幂

题目内容: 题目描述 给你三个整数 a,b,p,求 a^b mod p。

输入格式 输入只有一行三个整数,分别代表 a,b,p。

输出格式 输出一行一个字符串 a^b mod p=s,其中 a,b,p 分别为题目给定的值, s 为运算结果。

输入输出样例

一. 倍增思想的原理

a^1 = a a ^ 2 = a * a a ^ 4 = a^2 * a^2 a ^ 8 = a^4 * a^4 … 上述枚举的都是偶数次的,如果要求某个数的奇数次,该怎么求? 比如a^11 11的二进制表示为1011, 由二进制求十进制11 = 1*2 ^ 3 + 0 * 2 ^ 2 + 1 * 2 ^ 1 + 1 * 2^0; 发现二进制与倍增过程有对应关系:

综上, 我们可以枚举b的二进制, 枚举一次,判断当前位是否为1,是的话就将倍增数a加入到结果中, 不是1的话就继续枚举,直到枚举完 b 的所有二进制位.

二. 没有一种数据类型能够存下a^b的极端值,该如何解决这种问题? 通常题目会给出具体的取模数字, 需要注意以下三种取模运算规则

1. 计算过程只有加法和乘法是,取模可以放在任意位置 (a * b * c * d) % p = (a%p * b%p * c%p * d%p);

2. 计算过程存在减法,对结果取模可能出现负数, 如果需要化负为正,则通过"模 加 模"的方式来转化. 比如:(a-b)%p,将此式变为: [((a-b)%p)%p)+p]%p

3. 计算过程,存在除法,取模将会造成结果错误,此时需要求逆元,此规则后续有遇到再补充.

三. 代码实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		long a = sc.nextLong(),b = sc.nextLong(),p = sc.nextLong();
		long ret = qpow(a,b,p);
		System.out.println(a+"^"+b+" mod "+p+"="+ret);
	}
	public static long qpow(long a,long b,long p) {
		long ret = 1;//保存结果
		while(b > 0) {
			if((b&1) == 1) {
				ret = ret*a%p;
			}
			a = a*a%p;
			b >>= 1;//b右移一位.
		}
		return ret;
	}
}

2. 64位整数乘法

题目链接:

链接: P10446 64位整数乘法

题目内容: 求 a 乘 b 对 p 取模的值。

输入格式 第一行输入整数 a,第二行输入整数 b,第三行输入整数 p。

输出格式 输出一个整数,表示 a*b mod p 的值。

一. 分析题意

a × b = b个a相加 a = a 2a = a + a 4a = 2a + 2a 8a = 4a + 4a 16a = 8a + 8a …

二. 代码实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.Scanner;

//64位整数乘法
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		long a = sc.nextLong(),b = sc.nextLong(),p = sc.nextLong();
		System.out.println(mul(a,b,p));
	}
	public static long mul(long a,long b,long p) {
		long ret = 0;
		while(b > 0) {
			if((b&1) == 1) {
				ret = (ret+a)%p;
			}
			a = (a+a)%p;
			b >>= 1;
		}
		return ret;
	}
}

总结, 倍增思想实现快速幂的本质就是二进制边枚举边倍增,再加上判断.这种实现方式的代码非常好写,是赛场上的首选.

本篇博客到这里就结束啦, 感谢观看 ❤❤❤

🐎期待与你的下一次相遇😊😊😊

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-03-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
挑战程序竞赛系列(13):2.6辗转相除法
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014688145/article/details/73512251
用户1147447
2019/05/26
4100
算法系列之快速幂
数据范围位10^9,C++ 的O(n)级别算法支持10^7-10^8之间,所以需要比O(n)运算还快的logn算法。本题考察:快速幂。
公众号guangcity
2020/06/17
7140
疯子的算法总结(一) 位运算(快速幂、快速乘)
计算机通过二进制表示整形数,比如int型32位有符号整形数: 1表示为:0000…00001(共32位) -1表示为:1111…1111(共32位) 补码计算法定义:非负数的补码是其原码本身; 负数的补码是其绝对值的原码最高位符号位不变,其它位取反,再加1。 表示原因:计算机逻辑运算没有减法,-1+1最高为溢出,剩余0000000000(32位)即为0; 则有a-b=a+b的(补码); 计算方式: -1表示原码为100…0001(32位),最高位位符号位。 -1的反码表示为:1111…110(32位),除符号位按位取反。 -1的补码表示为:1111…1111(32位),反码+1。 正数的补码为自己本身。 例子: 100的补码‭00000000000000000001100100‬ -30的补码 11111111111111111111111100010‬ 100+(-30)=000000000000000000‭01000110‬ 转换成10进制为70;
风骨散人Chiam
2020/10/28
8980
快速幂运算及其应用
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
砖业洋__
2023/05/06
3140
数学--数论--快速乘法+快速幂
1.快速幂(快速模幂) ①求a^b: int pow(int a, int k) { int ans = 1; while(k) { if(k &1) ans *= a; //判断奇偶只用判断最后一位比取模快 a *= a; k >>=1; //比除法快多了 } return ans; } ②求a^b%p int pow_mod(int a, int k,int mod) { int ans =
风骨散人Chiam
2020/10/29
3280
快速幂算法详解(C++实现)
判断指数是偶数还是奇数这里,还有一种更高效的方法就是使用位运算,让b&1,因为1的补码只有最后一位为1,其余全为0,如果b是奇数的话,那它的最后一位为1,b&1的结果就是1,如果b是偶数,那最后一位为0,b&1的结果是0
YIN_尹
2024/01/23
1.1K0
快速幂算法详解(C++实现)
矩阵快速幂小结
由$n \times m$个数$a_{ij}$排成的$n$行$m$列的数表称为$n$行$m$列的矩阵,简称$n \times m$矩阵。
attack
2018/09/17
4720
矩阵快速幂小结
洛谷P1313 计算系数【快速幂+dp】
P1313 计算系数 题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数。 输入输出格式 输入格式: 输入文件名为factor.in。 共一行,包含5 个整数,分别为 a ,b ,k ,n ,m,每两个整数之间用一个空格隔开。 输出格式: 输出共1 行,包含一个整数,表示所求的系数,这个系数可能很大,输出对10007 取模后的结果。 输入输出样例 输入样例#1: 复制 1 1 3 1 2 输出样例#1: 复制 3 说明 【数据范围】 对于30% 的数据,有 0 ≤k
Angel_Kitty
2018/04/08
5530
【矩阵快速幂】简单题学「矩阵快速幂」Ⅱ
这是 LeetCode 上的「剑指 Offer 10- I. 斐波那契数列」,难度为「简单」。
宫水三叶的刷题日记
2021/09/10
6880
【板子】gcd、exgcd、乘法逆元、快速幂、快速乘、筛素数、快速求逆元、组合数
1.gcd int gcd(int a,int b){ return b?gcd(b,a%b):a; } 2.扩展gcd )extend great common divisor ll exg
饶文津
2020/06/02
1.3K0
题目1444:蓝桥杯201 4年第五届真题斐波那契
这里难点应该就是在【输入为一行用空格分开的整数n m p(0<n,m,p<10^18)】 ,这里一下子就把最大值干成long的最大范围了,很明显,long肯定也不行。
红目香薰
2022/12/05
2260
题目1444:蓝桥杯201 4年第五届真题斐波那契
51Nod 1046 A^B Mod C(日常复习快速幂)
1046 A^B Mod C 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出3个正整数A B C,求A^B Mod C。 例如,3 5 8,3^5 Mod 8 = 3。 Input 3个正整数A B C,中间用空格分隔。(1 <= A,B,C <= 10^9) Output 输出计算结果 Input示例 3 5 8 Output示例 3 题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=
Angel_Kitty
2018/04/09
4890
小女孩把快速幂奥秘探索出来了!
大家好,我是bigsai,之前有个小老弟问到一个剑指offer一道相关快速幂的题,这里梳理一下讲一下快速幂!
bigsai
2021/08/13
3770
BZOJ 1008 越狱
1008: [HNOI2008]越狱 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 8681  Solved: 3746 Description   监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果 相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱 Input   输入两个整数M,N.1<=M<=10^8,1<=N<=10^12 Output   可能越狱的状态数,模100003取余
Angel_Kitty
2018/04/08
7750
LeetCode50,一题学会快速幂
从题意来看,这道题平平无奇,基本上没有什么特别的。但是我们继续看它的note就会发现问题,其中x是浮点数,它的范围是-100到100。而n的范围则是32位int的范围,到这里就有问题了。
TechFlow-承志
2020/04/21
5590
LeetCode50,一题学会快速幂
2020牛客暑期多校训练营(第九场)
给定 a 、b 、c 、d 、x 、y ,求 \prod \limits^{b} _ {i=a}\prod \limits^{d} _ {j=c}gcd(x^i,y^j) 。
wenzhuan
2022/08/15
4020
矩阵快速幂
快速幂算法是用来快速计算指数表达式的值的,例如 210000000,普通的计算方法 2*2*2*2…10000000次,如果一个数字的计算都要计算那么多次的话,那么这个程序一定是失败的。
IsLand1314
2025/06/13
950
矩阵快速幂
0x01|算法竞赛进阶指南 - 位运算3题详解
算法进阶指南看了开头一部分,个人感觉讲解的比较透彻,于是打算写一些个人的读书笔记,主要是做题后做一个总结,不求快,但求能一点点讲清楚每个知识点。这一节来看看第一章的位运算部分。
ACM算法日常
2020/12/31
6470
0x01|算法竞赛进阶指南 - 位运算3题详解
算法—史上最好快速幂算法讲解
熟悉的1024没问题,总共计算了10次。但是如果让你算 (2^50)%10000呢?
bigsai
2020/11/03
6550
算法—史上最好快速幂算法讲解
基础数论总结
从右往左。可以一直递推,然后到最后一项,然后快速幂求矩阵,矩阵最终的结果就是所求结果。更新:java的矩阵通用乘法可以表示为,可以将下列代码替换道ac代码中:
bigsai
2019/09/24
7600
基础数论总结
相关推荐
挑战程序竞赛系列(13):2.6辗转相除法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验