题目地址:
https://www.luogu.com.cn/problem/P1226
题目描述:
给你三个整数
b
,
p
,
k
b,p,k
b,p,k,求
b
p
m
o
d
k
b^p \bmod k
bpmodk。
输入格式:
输入只有一行三个整数,分别代表
b
,
p
,
k
b,p,k
b,p,k。
输出格式:
输出一行一个字符串b^p mod k=s
,其中
b
,
p
,
k
b, p, k
b,p,k分别为题目给定的值,
s
s
s为运算结果。
思路是快速幂(或者也可以称为叫“倍增法”),由 b b b出发,依次计算 b 2 n , n = 0 , 1 , 2 , . . . b^{2^n},n=0,1,2,... b2n,n=0,1,2,...,然后将 p p p看成二进制,倍增地计算 b p m o d k b^p\mod k bpmodk。但是这里尤其要注意一个特殊情况,即 p = 0 , k = 1 p=0,k=1 p=0,k=1的情况,在返回之前仍然要模一次 k k k。代码如下:
#include <iostream>
using namespace std;
int b, p, k;
int fast_pow(int b, int p, int k) {
long res = 1, t = b;
while (p) {
if (p & 1) res = res * t % k;
p >>= 1;
t = t * t % k;
}
// 防止p = 0, k = 1的情况,返回之前再模一次
return (int) res % k;
}
int main() {
scanf("%d%d%d", &b, &p, &k);
printf("%d^%d mod %d=%d\n", b, p, k, fast_pow(b, p, k));
return 0;
}
时间复杂度 O ( log p ) O(\log p) O(logp),空间 O ( 1 ) O(1) O(1)。