快速幂(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); } };