快速幂算法简介

核心思想:底数平方,指数除二。
首先判断指数是奇数还是偶数。
①假设是偶数将底数平方将指数除以二。例如:
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;
}

posted @   冷月半明  阅读(36)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示