幂取模
题目描述
输入正整数a、n和m,输出
a
n
a^{n}
an
m
o
d
mod
mod
m
m
m的值。
范围:
a
,
n
,
m
<
=
1
0
9
a,n,m<=10^9
a,n,m<=109
输入描述
输入正整数a、n和m
输出描述
输出 a n a^{n} an m o d mod mod m m m
样例
输入
1 2 3
输出
1
解析
这道题明显是一道快速幂的题目,那么要点就来了:
什么是快速幂呢?
顾名思义,快速幂就是快速算底数的n次幂。其时间复杂度为
O
O
O(
log
2
N
\log_2{N}
log2N), 与朴素的
O
O
O(
N
N
N)相比效率有了极大的提高。
快速幂的实现思想可以用一个例子来说明:
2
100
2^{100}
2100的快速幂
只要为1的位我们就让它自增一位即可
AC代码
#include<iostream>
#include<cstdio>
using namespace std;
//快速幂函数(含题目的取余)
long long qpow(long long a, long long n, long long m) {
long long ans = 1;
while (n) {
//如果二进制位为1则自增
if (n % 2 == 1) {
ans = (ans * a) % m;
}
a = (a * a) % m; //a自增
n >>= 1; //n除以2(位运算)
}
return ans;
}
//朴素的主函数
int main() {
long long a, n, m;
scanf("%lld%lld%lld", &a, &n, &m);
long long ans = qpow(a, n, m);
printf("%lld", ans);
return 0;
}
附:快速幂函数
long long qpow(long long a, long long n) {
long long ans = 1;
while (n) {
if (n % 2 == 1) {
ans *= a;
}
a *= a;
n >>= 1;
}
return ans;
}