快速幂

Posted hoyoak

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速幂相关的知识,希望对你有一定的参考价值。

在OI中,我们有时需要快速算出ab,那么怎么算呢,循环乘吗,显然,当a和b都很大时,这种算法十分的

耗时,因此我么引入一个简单的数学知识——快速幂。

 


 

让我们先引入一个问题:

给定a,b,k,要求快速求出ab%的值。

快速幂就是适用于这种问题的一个方法,其主要运用了分治的思想,试想ab难求,那么我们为什么不先

算出ab/2呢,显然,ab=ab/2*ab/2,这样我们是不是就节省了一半的时间复杂度呢,这么一直分治下去,

如果分到b=1了,那么就返回a即可。同时运用随时取模性质,我们在每次计算ab/2*ab/2时,都取一下膜,

防止溢出,但还存在一个问题,就如果幂是奇数该怎么办QWQ?一样啊,奇数次幂与偶数次幂的差别就

少乘或多乘一个a而已,因为C++中整形运算向下取整,所以对于奇数次幂的运算,我们就计算ab/2*ab/2*a

即可。

 1 inline long long quickpow(long long a,long long b,long long k)
 2 
 3     if(k==0) return 1;
 4     if(k==1) return a;
 5     if(k%2==0)
 6     
 7         long long t=quickpow(a,b/2,k);
 8         return t*t%k;
 9      
10     if(k%2!=0)
11     
12         long long t=quickpow(a,b/2,k);
13         return t*t%k*a%k;
14     
15  

 

以上是关于快速幂的主要内容,如果未能解决你的问题,请参考以下文章

算法初步:快速乘,快速幂,矩阵快速幂

关于快速幂快速乘矩阵快速幂

求幂大法,矩阵快速幂,快速幂模板题--hdu4549

快速幂与矩阵快速幂

快速幂详解

快速幂与矩阵快速幂