快速冪介紹+快速冪板子題。c++

爲什麼要用快速冪?

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章