c++快速幂

快速幂算法是一种用于高效计算幂的算法,其基本思路是通过二进制位来优化计算过程。它能有效地减少计算次数,特别是在对大数进行幂运算时,速度更快。

快速幂算法的基本原理是:将指数表示为二进制形式,然后通过对二进制位数进行迭代分解,进行幂次运算。以求 $a^b$ 为例,假设指数 $b$ 的二进制表示为 $b_k b_{k-1} \cdots b_1 b_0$,其中 $b_i$ 为二进制位,$k$ 为二进制位数。则有:

$$a^b = a^{(b_k \cdot 2^k + b_{k-1} \cdot 2^{k-1} + \cdots + b_1 \cdot 2^1 + b_0 \cdot 2^0)}$$

$$=a^{b_k \cdot 2^k} \cdot a^{b_{k-1} \cdot 2^{k-1}} \cdots a^{b_1 \cdot 2^1} \cdot a^{b_0 \cdot 2^0}$$

其中,每一步计算的时候,都把底数自乘,指数右移一位,即可进行下一步计算。

快速幂算法的时间复杂度为 $O(\log n)$,其中 $n$ 表示指数的位数。因此,当幂次非常大时,快速幂算法可以大大提高计算效率。

快速幂算法有应用于RSA加密、哈希函数等领域中

感觉没啥好讲的

直接给出题目吧

给定 nn 组 ai,bi,pi,对于每组数据,求出 a^b%p 的值。

输入格式
第一行包含整数 n。

接下来 n 行,每行包含三个整数 ai,bi,pi。

输出格式
对于每组数据,输出一个结果,表示 a^b%p的值。

每个结果占一行。

数据范围
1≤n≤100000
1≤ai,bi,pi≤2×10^9

具体代码如下

#include 
#include 

using namespace std;

typedef long long LL;


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


int main()
{
    int n;
    scanf("%d", &n);
    while (n -- )
    {
        int a, b, p;
        scanf("%d%d%d", &a, &b, &p);
        printf("%lld\n", qmi(a, b, p));
    }

    return 0;
}

感觉纯纯背单词一下记住qmi函数

你可能感兴趣的:(算法,c++)