快速幂解法

快速幂

简述

快速幂是一般求幂方法的优化,主要是在时间复杂度上的优化,从O(n)到O(logn),极大的降低了时间复杂度,也可以解决一些对时间复杂度要求严格的题目。

一般求幂方法

#include <stdio.h>
#define ll long long int
ll fun(ll a, ll b) { //fun用于求a^b的值
	ll ans = 1; //ans用于存放结果
	while (b--) {
		ans = ans * a;
	}
	return ans;
}

由上面代码可见,一般求幂方法简单暴力,很容易会时间超限什么的,个人不推荐用,除非在那道题中可以用。

快速求幂方法

#define ll long long int
ll fun(ll a, ll b) { //fun用于求a^b的值,a作为基数,b作为次数
	ll ans = 1; //ans用于存放结果
	while (b) { //当次数b==0时,while循环结束
		if (b & 1) { //判断次数b是否为奇数,b & 1等价于b % 2,而且时间复杂度更低
			ans *= a; //当数为奇数时,将基数a乘入结果中
		}
		b >>= 1; //次数b除以2,比b/=2的时间复杂度更低
		a *= a; //基数a翻a倍
	}
	return ans;
}

快速幂的主要思路就是将需求数拆分成若干个数的乘积。
原理借鉴于https://blog.csdn.net/csdnqixiaoxin/article/details/80958620

快速幂取模方法

#define ll long long int
ll fun(ll a, ll b, ll mod) { //fun用于求a^b的值,a作为基数,b作为次数,mod作为模
	ll ans = 1; //ans用于存放结果
	while (b) { //当次数b==0时,while循环结束
		if (b & 1) { //判断次数b是否为奇数,b & 1等价于b % 2,而且时间复杂度更低
			ans *= a % mod; //当数为奇数时,将基数a乘入结果中并取一次模
		}
		b >>= 1; //次数b除以2,比b/=2的时间复杂度更低
		a *= a % mod; //基数a翻a倍并取一次模
	}
	return ans % mod; //这里的模,可取可不取,保险就取
}

方法一样就不再解释。

发布了5 篇原创文章 · 获赞 1 · 访问量 98

猜你喜欢

转载自blog.csdn.net/Vcatroy/article/details/104001361