洛谷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;
}
上一篇: 单身狗狠起来自己都不放过
下一篇: 凉拌魔芋丝应该怎么做好吃