快速幂算法简介
核心思想:底数平方,指数除二。
首先判断指数是奇数还是偶数。
①假设是偶数将底数平方将指数除以二。例如:
4^8=16^4;按照这个方法继续代还为256^26=65536;
②当指数为奇数时就要想办法将指数转化为偶数,然后按照上述逻辑继续简化。例如2^9=2^8×2=4^4×2=16^2×2=256×2=512;
这样就可以大大减小计算量 ,降低时间复杂度。
对于求余(MOD,%)我们可以知道:
(a + b) mod k = (a mod k + b mod k) mod k
(a - b) mod k = (a mod k - b mod k + k) mod k
(a * b) mod k = ((a mod k ) * (b mod k)) mod k
而(a / b) mod k 需要用到乘法逆元. 如下:
乘法逆元:如果满足 (b * b1 ) mod k = 1,则称最小的正整数解b1为b mod k 的乘法逆元。
而(a/b)mod k = (a * b1) mod k。
所以如果我们要求A的B次方的结果对C取模可以用一下模板:
#include <cstdio>
#include <cmath>//#include<bits/stdc++.h>.万能头
#include <cstring>//memcpy(HH,hh,sizeof(hh));赋值函数,将hh赋值给HH
#include <iostream>//str.erase(std::remove(str.begin(), str.end(), 'k'), str.end());删除指定字符
#include<algorithm>//排列函数next_permutation(a,a+4);
#include<stack>
#include<queue>
using namespace std;
long long mi(long long A,long long B,long long C){
long long mid = 1;
while(B){//质数不为零
if(B&1){//位运算判断奇偶
mid *= A;//结果乘当前底数
mid %= C;
}
A *= A;//底数平方化
A %= C;
B /= 2;//指数减少一倍
}
return mid;
}
int main(){
std::ios::sync_with_stdio(false);
long long A,B,C;
cin>>A>>B>>C;
cout<<mi(A,B,C)<<endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)