爲什麼要用快速冪?
思考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。這個題直接計算複雜度過高,所以一定要引入快速冪運算。