当前位置: 首页 > news >正文

【算法】快速幂

一、概念

快速幂是一种高效的指数运算,当指数范围过大时,通过位运算能够减少大量的计算次数

对于a^{b},我们通过将指数b转化为二进制数,就可以将a^{b}分解为许多的a^{2^{i}}(其中i是指数b中对应位为1的位数)

例如a^{13},我们可以将13转化为二进制的1101,然后就可以将a^{13}分解为:

                        ​​​​​​​        ​​​​​​​        ​​​​​​​        a^{2^{0}}*a^{2^{2}}*a^{2^{3}}=a^{1}*a^{4}*a^{8}=a^{13}


二、例题

2.1 快速幂

875. 快速幂 - AcWing题库

代码:

#include <bits/stdc++.h>
using namespace std;

#define int long long

int n;

signed main()
{
    cin >> n;
    for(int i = 0;i < n; i++)
    {
        int a, b, p;
        cin >> a >> b >> p;
        int res = 1;
        while(b) //将b转二进制数,按位乘以对应的值
        {
            if(b & 1) //对应位为1
                res = res * a % p;
            a = a * a % p;
            b >>= 1; 
        }
        cout << res << endl;
    }
    return 0;
}

2.2 快速幂求逆元 

876. 快速幂求逆元 - AcWing题库

关于乘法逆元的定义:

前提:

  • 整数b,m互质
  • 整数a满足b能够整除a

结论:若存在整数x满足\frac{a}{b}\equiv a*x(mod m),即\frac{a}{b}a*x对模数m同余,则x是b的逆元,记为b^{-1}

拓展——费马小定理:当模数m为质数时,b^{m-2}就是b的乘法逆元

可以看到题中模数p是质数,所以我们可以使用费马小定理求a模p的乘法逆元,就是a^{p-2}

但是p的范围很大,因此我们需要用快速幂

代码:

#include <bits/stdc++.h>
using namespace std;

#define int long long

int n;

signed main()
{
    cin >> n;
    for(int i = 0;i < n; i++)
    {
        int a, p;
        cin >> a >> p;
        if(a % p == 0) //不互质
            cout << "impossible" << endl;
        else
        {
            int t = p - 2; //费马小定理
            int res = 1;
            while(t) //快速幂
            {
                if(t & 1)
                    res = res * a % p;
                a = a * a % p;
                t >>= 1;
            }
            cout << res << endl;
        }
    }
    return 0;
}

相关文章:

  • 6内存泄露问题的讨论
  • MySQL其他客户端程序
  • 边缘计算:工业自动化的智能新引擎
  • 低成本文件共享解决方案:Go File本地Docker部署与外网访问全记录
  • 小米平板 4 Plus 玩机日志
  • Xvfb和VNC Server是什么
  • 使用自定义的RTTI属性对对象进行流操作
  • 7对象树(1)
  • 文本分析(非结构化数据挖掘)——特征词选择(基于TF-IDF权值)
  • Java项目打包(使用IntelliJ IDEA打包Java项目)
  • Ubuntu 22.04 LTS 下载英伟达驱动
  • 买家利益为中心的购物平台
  • 每日一题洛谷P8716 [蓝桥杯 2020 省 AB2] 回文日期c++
  • Mapbox GL JS 实现鼠标绘制矩形功能的详细代码和讲解
  • C++ | std::function
  • Spring Boot中对同一接口定义多个切面的示例,分别通过接口方式和注解方式实现切面排序,并对比差异
  • 基于方法分类的无监督图像去雾论文
  • 小白入门机器学习概述
  • 128. 最长连续序列
  • 树莓派超全系列文档--(18)树莓派配置音频
  • 漳州网站制作/seo广告优化
  • 青岛做外贸网站建设/seo 页面链接优化
  • 有那些可以自己做壁纸的网站/google引擎免费入口
  • 25个网站/seo站长工具
  • 昆山普立斯特做的有网站/软件推广的渠道是哪里找的
  • 建站公司建的网站能改动吗/兰州快速seo整站优化招商