快速幂介绍+快速幂板子题。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。这个题直接计算复杂度过高,所以一定要引入快速幂运算。

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