0
点赞
收藏
分享

微信扫一扫

0x01-位运算-------《算法竞赛进阶指南》

Aliven888 2022-03-22 阅读 54
c++算法

基本介绍:

bit是度量信息的单位,有0,1两种状态。在程序运行时合理利用位运算能大大降低程序的复杂度。

例题:

x^{y}

求 a的 b 次方对 p 取模的值。

输入格式:

三个整数 a,b,p 在同一行用空格隔开。

输出格式:

输出一个整数,表示a^{b} mod p的值。

数据范围:

0 <= a,b <= 10^{9},1 <= p <= 10^{9}

输入样例:

3 2 7

输出样例:

2

 暴力乘会执行b次乘法,效率过低。

做法:快速幂

根据数学常识,一个正整数可以唯一的表示为若干指数不同的2的k次幂的和(整数的二进制表达)

也就是说如果b在二进制下表式有k位,第i(0<= i <= k)的数字是c_{i}那么:

 因为k = \left \lceil log_{2}(b + 1) \right \rceil,所以上式乘积项的数量不多与k=(.....)个。所以运算的效率式很高的

通过公式的展开我们可以得到代码:

#include <bits/stdc++.h>

using namespace std;

int power(int a,int b,int p){
    int res = 1;
    while(b){
        if(b & 1)res = (long long)res * a % p;
        a = (long long)a * a % p;
        b >>= 1;
    }
    return res % p;
}

int main(){
    int a,b,p;
    cin >> a >> b >> p;
    cout << power(a,b,p);

    return 0;
}
举报

相关推荐

0 条评论