• 《算法竞赛进阶指南》 第一章 Acwing 89. a^b 位运算 更新bitset版本


    地址 https://www.acwing.com/problem/content/description/91/

    求 a 的 b 次方对 p 取模的值。
    
    输入格式
    三个整数 a,b,p ,在同一行用空格隔开。
    
    输出格式
    输出一个整数,表示a^b mod p的值。
    
    数据范围
    0≤a,b≤10^9
    1≤p≤10^9
    输入样例:
    3 2 7
    输出样例:
    2

    解答

    遍历一个个乘 肯定TLE的

    a的15次方 也就是 a * a2*a4*a8

    a8不必使用a乘以8次  而是可以利用前面a4的结果  a8= a4*a4

    a4不必使用a乘以4次  而是可以利用前面a2的结果  a4= a2*a2   

    那么类似的

    a的b次方   b可以拆解为  2x+2y+2z+~~~

    而 x y z等不必完全从2逐个相乘得到 而是利用前面的 x/2  y/2  z/2的结果

    对于题目中的b  我们转化为2进制  逐个将b>>1 并 &1 检测结尾是否为1 判断是否需要进行乘法运算

    a的7次方 就可以分解为  a的1次方 a的2次方  a的4次方相乘  只需要3次乘法运算即可

    代码

    #include <iostream>
    
    using namespace std;
    
    long long   a,b,p, ans= 1;
    int main(){
        cin >>a>>b>>p;
        while(b){
            if(b&1) ans = ans*a%p;
            b>>=1;
            a=a*a%p;
        }
        
        cout << ans%p<<endl;
        
        return 0;
    }
    #include <iostream>
    #include <bitset>
    
    using namespace std;
    long long  a, b, p;
    long long ans = 1;
    
    int main() {
        cin >> a >> b >> p;
        bitset<50> bset(b);
    
        for (int i = 0; i < 32; i++) {
            if (bset[i] == 1) {
                ans = ans * a%p;
            }
            a = a * a%p;
        }
        cout << ans % p << endl;
        return 0;
    }
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    php 通过header下载中文文件名 压缩包损坏或文件不存在的问题
    MySQL查看数据库安装路径
    PHP 中move_uploaded_file 上传中文文件名失败
    C# Windows异步I/O操作
    .Net 环境下比较各种数据库插入操作的性能
    GenericFactoryMethod泛型工厂模式实现简单IOC功能
    State状态模式
    .Net RabbitMQ之消息通信 构建RPC服务器
    .Net RabbitMQ系列之环境搭建于RabbitMQ基本介绍
    C# 算法之选择排序
  • 原文地址:https://www.cnblogs.com/itdef/p/14563391.html
Copyright © 2020-2023  润新知