快速幂问题

问题描述

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

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

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

数据范围
0≤a,b,p≤109
数据保证 p≠0
输入样例:

3 2 7

输出样例:

2

快速幂思想

如果我们想求37是多少,用最暴力的做法只需要循环进行7次相乘,但是如果我们想求的是31000000,即3的100万次幂呢?
先从3^7开始看
7的二进制表示为111,我们可以发现31=3,32=9,3^4=81,
而3^1 * 3^2 * 3^4 = 3^7
那么100万不会超过2^20
3^1 = 3, 3^2=9, ... , 3^19
找出二进制为1的存在,将这些进行相乘,就可以得到最后的结果

代码如下

#include<iostream>

using namespace std;

int main()
{
    int a, b , p;
    cin >> a >> b >> p;
    int res = 1 % p;
    // 求出b的二进制表示
   while(b)
   {
       if(b & 1) res = res * 1ll * a % p; // 如果二进制个位是1就需要把答案乘上a
       // 十位就是不断的平方,3^1=1,3^2=9,3^3=27
       a = a * 1ll * a % p;
       b >>= 1; // 把个位去掉
       // 下次循环就是循环10位,依此类推
   }
   cout << res << endl;
   return 0;
}
posted @ 2020-10-23 21:19  晓尘  阅读(121)  评论(0)    收藏  举报