【算法】快速幂

算法-快速幂


前置知识
  • 倍增

思路

我们要求 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;
}

练习
相关推荐
2301_800256112 分钟前
8.2 空间查询基本组件 核心知识点总结
数据库·人工智能·算法
不穿格子的程序员2 分钟前
从零开始写算法——矩阵类题:矩阵置零 + 螺旋矩阵
线性代数·算法·矩阵
ULTRA??17 分钟前
C/C++函数指针
c语言·开发语言·c++
还没想好取啥名18 分钟前
C++11新特性(一)——自动类型推导
开发语言·c++·stl
我是华为OD~HR~栗栗呀21 分钟前
华为OD-C面经-23届学院哦
java·c++·python·华为od·华为·面试
资深web全栈开发26 分钟前
LeetCode 3432. 统计元素和差值为偶数的分区方案数
算法·leetcode
西贝爱学习33 分钟前
Visual Studio下载地址,vs2022安装程序
c++
黎茗Dawn35 分钟前
DDPM-KL 散度与 L2 损失
人工智能·算法·机器学习
天赐学c语言36 分钟前
12.5 - 二叉树的最近公共祖先 && 构造函数和析构函数可以是虚函数吗
c++·二叉树·虚函数
wearegogog12336 分钟前
DEA模型MATLAB实现(CCR、BCC、超效率)
开发语言·算法·matlab