【洛谷】P1226 【模板】快速幂||取余运算

题目地址:

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)。

上一篇:CSAPP中一个有意思的小东西


下一篇:filter+transition实现点亮图片效果