为什么要用快速幂?
思考a的n次方需要进行多少次运算?
最简单的算法就是进行n-1次乘法运算,时间复杂度是O(n)。
如果采用分而治之的策略,时间复杂度是O(log2n)。
以261的计算为例:
一共需要9次乘法运算,而常规做法需要60次乘法运算。
快速幂怎么实现?
根据上面的分治我们可以知道:
分治到某一步需要求解ax,当x是偶数的时候直接返回ax/2 ×a x/2 。当x是奇数的时候返回ax/2×ax/2×a。边界是x=0时返回1。
long long quick_pow(long long a,long long b)
{
if(b==0)return 1;
long long temp=quick_pow(a,b/2);
if(x%2==0)
return temp*temp;
else
return temp*temp*a;
}//当然,不用递归也可以用迭代
给出3个正整数A B C,求A^B Mod C。
输入3个正整数A B C,中间用空格分隔。(1 <= A,B,C <= 10^9),输出计算结果。
sample input:
3 5 8
sample output:
3
#include<iostream>
#include<string>
using namespace std;
long long quickpow(long long a,long long b,long long c)
{
long long ans=1;
a=a%c;
while(b>0)
{
if(b%2==1)//奇数幂
{
ans=ans*a;
ans=ans%c;
b--;
}
b/=2;
a=(a*a)%c;
}
return ans;
}
int main()
{
long long a,b,c;
cin>>a>>b>>c;
long long ans;
ans=quickpow(a,b,c);
cout<<ans<<endl;
return 0;
}
这里需要注意的是,虽然a,b,c<=10^9,可以用int 定义,但是在运算中ans和a可能会超范围,所以统一使用long long。这个题直接计算复杂度过高,所以一定要引入快速幂运算。