欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

洛谷P1226 快速幂||取余运算 题解

程序员文章站 2022-05-14 18:48:38
...

题目描述

输入b,p,k的值,求b^p mod k的值。其中b,p,k*k为长整型数。

输入输出格式

输入格式:

三个整数b,p,k.

输出格式:

输出“b^p mod k=s”

s为运算结果

输入输出样例

输入样例#1:

2 10 9

输出样例#1:

2^10 mod 9=7

题解

经典的分治题,首先我们知道:ab%k=(a%k)(b%k)%k,这样我们就可以把大幂分成小幂,然后合并在取余,现在我们要把次数分成小的逐步处理:p = 2p/2+p%2,设p = 15,b^15 = b ^(27+1) = b+b^7+b^7,递归拆分为小问题,逐步取余;

#include <iostream>
using namespace std;
long long b, p, k,temp;
int FastPower(long long p) {
    if (p == 0) return 1;                  //b^0%k = 1
    long long t = FastPower(p / 2) % k;   //拆分求解
    t = (t*t) % k;
    if (p % 2 == 1) {        //如果p为奇数,则b^p%k = ((b^(p/2))^2)*b%k
        t = (t*b) % k;
    }
    return t;
}
int main() {
    cin >> b >> p >> k;
    if (b == k) {
        cout << b << '^' << p << " mod " << k << '=' << 0;
        return 0;
    }
    temp = b;
    b %= k;    //防止过大
    cout << temp << '^' << p << " mod " << k << '=' << FastPower(p);
    system("pause");
    return 0;
}

 

相关标签: C NOIP