快速幂(Fast Power),顾名思义,就是快速算底数 x 的 n 次幂。其核心思想就是每一步都把指数减半,而相应的底数做平方运算。这样不仅能把非常大的指数给快速变小,所需要执行的循环次数也变小,而最后表示的结果不会变化。
题目:
求 aa 的 bb 次方对 pp 取模的值。
输入格式
三个整数 a,b,pa,b,p ,在同一行用空格隔开。
输出格式
输出一个整数,表示a^b mod p
的值。
数据范围
0≤a,b≤1090≤a,b≤109
1≤p≤1091≤p≤109
输入样例:
3 2 7
输出样例:
2
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long a,b,p,sum=1;
cin>>a>>b>>p;
while(b)
{
if(b&1)
sum=sum*a%p;
b>>=1;
a=a*a%p;
}
cout<<sum%p<<endl;
return 0;
}
拓展:
题目:
实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。
示例 1:
输入:x = 2.00000, n = 10
输出:1024.00000
示例 2:
输入:x = 2.10000, n = 3
输出:9.26100
示例 3:
输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25
提示:
-100.0 < x < 100.0
-231 <= n <= 231-1
n 是一个整数
要么 x 不为零,要么 n > 0 。
-104 <= xn <= 104
AC代码:
class Solution {
public:
double ksm(double x,long long n)
{
if(n==0)
return 1.0;
double y=ksm(x,n/2);
if(n%2==0)
return y*y;
else
return x*y*y;
}
double myPow(double x, int n)
{
long long y=n;
if(n>=0)
return ksm(x,y);
else
return 1.0/ksm(x,-y);
}
};