AcWing 89. a^b

题目传送门

一、题目大意

\(a\)\(b\) 次方对 \(p\) 取模的值。

二、解题方法

一看到这道题,就可以知道是快速幂。
这道题的重点是快速幂,那我就来认真讲讲。

快速幂是使用二进制的思想来在 \(O(logn)\) 的时间内解决幂的问题的方法。

举个栗子
\(7\)\(10\)次方

计算思路:
\(10 = (1010)_2\)

从右向左
\(7^1=7\)
\(7^2 = 7^1 * 7^1\)
\(7^4 = 7^2 * 7^2\)
\(7^8 = 7^4 * 7^4\)

如上面的办法,我们只需要计算\(4\)次,成倍的翻番,而不用最笨的乘\(10\)次!所得的结果相乘或不断取模就行了。

三、实现代码

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

int main() {
    LL a, b, p, res = 1;
    cin >> a >> b >> p;
    while (b) {
        if (b & 1) res = res * a % p;
        a = a * a % p;
        b >>= 1;
    }
    printf("%lld\n", res % p);
    return 0;
}
posted @ 2022-05-25 15:55  糖豆爸爸  阅读(85)  评论(0编辑  收藏  举报
Live2D