快速幂之a^b%p

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

输入格式

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

输出格式

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

数据范围

0a,b1e9  0≤a,b≤1e9
1p1e9  1≤p≤1e9

输入样例:

3 2 7

输出样例:

2
思路:
这道题目给出的数据范围是1e9,当然如果我们进行暴力乘的话肯定是溢出的

在解答本题之前我们先学习一下快速幂的一些基本知识
顾名思义,快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高
例如: 求 3 的 7 次方对 7的取模
当  3 ^ 1 = 3
   3 ^ 2 = 9
   3 ^ 3 = 3^1 * 3^2
   3 ^ 4 = (3^2)^2

代码:
 
#include<bits/stdc++.h>

using namespace std;

int main(){
    int a,b,p;
    cin>>a>>b>>p;
    int res=1 % p;       // 结果
    while(b){
        if(b & 1){     // 如果此时b为奇数,就进行乘处理
            res = res* 1ll * a % p;
        }
        a = a * 1ll * a %p;   // a 变为原来的两倍
        b >>= 1;      // 将 b 左移一位,相当于系数除以2
    }
    cout << res << endl;    
    return 0;
} 

 



posted @ 2021-10-31 23:28  爱慕6  阅读(116)  评论(0)    收藏  举报