【题目描述】
求 a 的 b 次方对 p 取模的值。
【输入格式】
三个整数 a,b,p ,在同一行用空格隔开。
【输出格式】
输出一个整数,表示a^b mod p的值。
题目分析:如果暴力的话数据范围过大会导致计算时间过长,优化如下:
将b以二进制形式表示
例如:求3 ^ 7 ,我们可以将7的二进制形式写出来 也就是111
3 ^ 1 = 3
3 ^ 2 = 9
3 ^ 4 = 81
3 ^ 7 = 3 ^ 1 * 3 ^ 2 * 3 ^ 4
也就是利用前一个的平方来计算,指数速度将会是2的n次方,那么时间复杂度就是O(logn)大大优化了速度
#include <iostream>
using namespace std;
int main()
{
int a, b, p;
cin >> a >> b >> p;
int res = 1 % p;
while(b)
{
if(b&1) res = res * 1ll * a % p;//数据范围在1e9内,因此要强制转换成longlong型,个位与上1,若是1则乘上a
b >>= 1; //进入下一位
a = a* a * 1ll % p;//准备好十位,平方即可
}
printf("%d",res);
}