The function Power calculates the exponential function Nk. But since the exponential function grows rapidly, you are supposed to return (Nk)%10007 instead.
Format of function:
int Power(int N, int k);
Both N and k are integers, which are no more than 2147483647.
Sample program of judge:
#include <stdio.h>
int Power(int, int);
const int MOD = 10007;
int main()
{
int N, k;
scanf("%d%d", &N, &k);
printf("%d\n", Power(N, k));
return 0;
}
/* Your function will be put here */
Sample Input 1:
2 3
Sample Output 1:
8
Sample Input 2:
128 2
Sample Output 2:
6377
分析:
此题考察快速幂方法,使用方法为:(ab) mod c 等价于 (a mod c)b mod c,推导我没有推出来(推导流程可以参考我下面附上的链接),不过这个可以直接作为一个公式使用,在降低时间复杂度上十分有用。
实现:
1.递归方法:
int Power(int N, int k)
{
N %= MOD;
if (k == 0)
return 1;
if (k > 0) {
if (k % 2 == 1)
{
return N * Power(N, k - 1) % MOD;
k /= 2;
}
else
{
k /= 2;
return Power(N, k)*Power(N, k) % MOD;
}
}
}
2.非递归方法:
int Power(int N, int k)
{
int n = 1;
N = N % MOD;
while (k > 0) {
if (k % 2 == 1)
n = n * N % MOD;
k /= 2;
N = N * N % MOD;
}
return n;
}
实际上,非递归适用性更广一些,如果k比较大的话,递归方法其实是比较耗时间的,因为内部要不断递归,才能得到那个较大的k的结果,但非递归方法却能很好的解决这个问题。我自己写的时候只想到了递归的方法,虽然这个也能解决每一个样例点,但在以后解决时间复杂度的时候还是需要多运用非递归方法
非递归方法我参考的是大佬的博客,链接如下:
https://blog.csdn.net/anniewwy/article/details/83869888