最近在牛客第一次碰到有关快速幂的知识,在此记录加深理解一下。大佬勿进,我怕《《 》》
快速取幂的用途
在一些竞赛中,可能会遇到指数型的数据取模问题,这个时候直接用int或者long long 储存,就非常有可能超出计算机整数的存取范围(哈哈,一般都会超,毕竟是竞赛!!!),从而数据出错,所以我们就引出今天的主角色 快速幂取模。这种方法在时间和空间都做了尽可能的优化,非常好用哦!
快速幂取模的思路分析
基本理论是离散数学的知识*(数学很重要!)*
有一个引理我们需要清楚的:积的取余等于取余的积的取余。
公式:(ab)%c = (a%c)(b%c)%c
核心思想是将大数幂运算拆解成相应的乘法运算,利用上述式子,始终将我们的运算的数据量控制在c的范围下。
以求a的b次方来介绍
把b转换成二进制数。
例如
11的二进制是1011
对二进制的位运算,在此就不赘述,有问题的同学请自行百度,这里我们需要用到“&”与“>>”运算符。
先来一段具体代码,由代码来讲解
ll binaryPow(ll num, ll k)
{
ll ans = 1;
while(k>0)
{
if(k&1)
ans = ans*num%mod;