AcWing 875. 快速幂
. 快速幂
一、题目描述
给定 组 ,对于每组数据,求出 的值。
输入格式
第一行包含整数 。
接下来 行,每行包含三个整数 。
输出格式
对于每组数据,输出一个结果,表示 的值。
每个结果占一行。
数据范围
二、快速幂原理
答:通过将指数拆分成几个因数相乘的形式,来简化幂运算。在计算 的时候,普通的幂运算算法需要计算次,但是如果我们将它拆分成 ,再进一步拆分成 只需要计算次。嗯?哪来的次?,别急,接着看。
这种拆分思想其实就是借鉴了二进制与十进制转换的算法思想(倍增),我们知道的二进制是,可以知道:
原理就是利用位运算里的位移“>>”和按位与“&”运算,代码中其实就是取二进制的最低位,用来判断最低位是还是,再根据是还是决定乘不乘,不理解的话联系一下二进制转换的过程。
其实就是将k的二进制向右移动一位,就这样位移、取最低位、位移、取最低位,这样循环计算,直到指数为为止,整个过程和我们手动将二进制转换成十进制是非常相似的。
普通幂算法是需要循环指数次,也就是指数是多少就要循环计算多少次,而快速幂因为利用了位移运算,只需要算“指数二进制位的位数”次,对于来说,二进制是,有位,就只需要计算次,快速幂算法时间复杂度是级别,对于普通幂需要计算一百万次的来说,快速幂只需要计算次,这是速度上质的飞跃,但是需要多注意溢出的问题。
三、简单粗暴快速幂
可用于结合高精度乘法
#include <bits/stdc++.h>
using namespace std;
int qmi(int a, int k) {
int res = 1;
while (k) {
if (k & 1) res = res * a; //假设乘法不会造成溢出
k >>= 1;
a = a * a; //假设乘法不会造成溢出
}
return res;
}
int main() {
printf("%d",qmi(3,4));
return 0;
}
四、带取模的快速幂
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n;
int qmi(int a, int k, int p) {
int res = 1;
while (k) {
if (k & 1) res = res * a % p;
k >>= 1;
a = a * a % p;
}
return res;
}
signed main() {
cin >> n;
while (n--) {
int a, k, p;
cin >> a >> k >> p;
printf("%d\n", qmi(a, k, p));
}
return 0;
}
五、龟速乘
题目描述
(位整数乘法)求 乘 对 取模的值。
输入格式
第一行输入整数,第二行输入整数,第三行输入整数。
输出格式
输出一个整数,表示 的值。
数据范围
输入样例
3
4
5
输出样例
2
算法思想
二进制思想。如果直接计算这会爆 ,所以采用 类似于快速幂的思想 把 作为二进制形式进行处理,然后如果某位上为就加上它次方,并且每次计算后取模就可以了。
例如:,那么。
时间复杂度
将乘数的每个二进制位取出进行判断,时间复杂度为。
代码实现
#include <bits/stdc++.h>
using namespace std;
#define int long long
// 龟速乘
int gui(int a, int b, int p) {
int res = 0;
while (b) {
if (b & 1) res = (res + a) % p;
a = (a + a) % p;
b >>= 1;
}
return res;
}
int main() {
int a, b, p;
cin >> a >> b >> p;
printf("%lld\n", gui(a, b, p));
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2013-06-29 电大与152双向数据同步的方案