【算法】快速幂

算法-快速幂


前置知识
  • 倍增

思路

我们要求 a n a^n an。

简单的方法是 a n = a n − 1 ⋅ a a^n=a^{n-1}\cdot a an=an−1⋅a

但是我们不妨使用倍增的思想

若 2 ∣ n 2\mid n 2∣n,则 a n = a n 2 2 a^n={a^{\frac n 2}}^2 an=a2n2

若 2 ∤ n 2\nmid n 2∤n,则 a n = a ⌊ n 2 ⌋ 2 ⋅ a a^n={a^{\lfloor{\frac n 2}\rfloor}}^2\cdot a an=a⌊2n⌋2⋅a


算法参数
  • 时间复杂度: O ( log ⁡ n ) O(\log n) O(logn)
  • 空间复杂度: O ( 1 ) O(1) O(1)

实现代码
  • 基础版本
cpp 复制代码
int pow(int x,int y){
    int res=1;
    while (y){
        if (y&1) res=res*x;
        x=x*x;
        y>>=1;
    }
    return res;
}
  • 取模版本
cpp 复制代码
int pow(int x,int y,int M){
    int res=1;
    while (y){
        if (y&1) res=res*x%M;
        x=x*x%M;
        y>>=1;
    }
    return res;
}

练习
相关推荐
宁清明20 小时前
【小宁的学习日记2 C语言】C语言判断
c语言·学习·算法
2401_8414956421 小时前
【数据结构】基于Prim算法的最小生成树
java·数据结构·c++·python·算法·最小生成树·prim
追烽少年x1 天前
Qt中使用C++日志库
c++·qt
祈祷苍天赐我java之术1 天前
解析常见的限流算法
java·数据结构·算法
mit6.8241 天前
dp|拆分控制
c++
Shinom1ya_1 天前
算法 day 34
算法
啊董dong1 天前
课后作业-2025-10-26
c++·算法·noi
liu****1 天前
1.模拟算法
开发语言·c++·算法·1024程序员节
小猪咪piggy1 天前
【算法】day10 分治
数据结构·算法·排序算法
又是忙碌的一天1 天前
算法学习 13
数据结构·学习·算法