版权声明:原创博客,转载请标明出处! https://blog.csdn.net/caipengbenren/article/details/89500204
a^b
求 a 的 b 次方对 p 取模的值。
输入格式
三个整数 a,b,p ,在同一行用空格隔开。
输出格式
输出一个整数,表示a^b mod p的值。
数据范围
1≤a,b,p≤109
输入样例:
3 2 7
输出样例:
2
这一题可以利用朴素算法,直接把a乘b次,时间复杂度是O(n),也可以使用快速幂,降低到log(n).
这里提供一种刷题过程中常用的ksm算法。
要求 的结果。可以将十进制b看成二进制利用位运算的方法。以b=9为例,
由于是二进制,很自然地想到用位运算这个强大的工具: & 和 >> ,&运算通常用于二进制取位操作,例如一个数 & 1 的结果就是取二进制的最末位。还可以判断奇偶x&1== 0为偶,x&1==1为奇。>>运算比较单纯,二进制去掉最后一位 。
需要注意的是:所有数%1 都等于0.
#include<bits/stdc++.h>
using namespace std;
int main () {
int a, b, c;
cin >> a >> b >> c;
int ans = 1 % c, res = a;
while (b) {
if (b & 1) ans = 1ll * ans * res % c;
res = 1ll * res * res % c;
b >>= 1;
}
cout << ans;
return 0;
}