[位运算] a^b

版权声明:原创博客,转载请标明出处! https://blog.csdn.net/caipengbenren/article/details/89500204

a^b

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

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

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

数据范围
1≤a,b,p≤109
输入样例:

3 2 7

输出样例:

2


这一题可以利用朴素算法,直接把a乘b次,时间复杂度是O(n),也可以使用快速幂,降低到log(n).
这里提供一种刷题过程中常用的ksm算法。

要求 a b a^b 的结果。可以将十进制b看成二进制利用位运算的方法。以b=9为例, b b = 101 , a 9 = a ( 2 0 + 2 2 ) . b_b=101,a^9=a^{(2^0+2^2)}.

由于是二进制,很自然地想到用位运算这个强大的工具: & 和 >> ,&运算通常用于二进制取位操作,例如一个数 & 1 的结果就是取二进制的最末位。还可以判断奇偶x&1== 0为偶,x&1==1为奇。>>运算比较单纯,二进制去掉最后一位 。

需要注意的是:所有数%1 都等于0.

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

int main () {
    int a, b, c;
    cin >> a >> b >> c;
    int ans = 1 % c, res = a;
    while (b) {
        if (b & 1) ans = 1ll * ans * res % c;
        
        res = 1ll * res * res % c;
        b >>= 1;
    }
    cout << ans;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/caipengbenren/article/details/89500204