快速幂的思想

Posted summer20020929

tags:

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

预备知识:
a*b%p=((a%p)*b)%p
(a+b)%p=(a%p+b)%p
         

快速幂就是快速求一个数的幂

两个整数a,b,求a^b

把b分解成几个2的次方的和,然后就相当于做一个指数乘法

比如说2^11

11=2^3+2^1+2^0

ans=2^(2^3+2^1+2^0)=2^(2^3)*2^(*2^1)+2^(2^0)

代码:

long long ksm(long  long a,long long  b){
long long ans=1;
while(b){
if(b&1==1)     ans*=a; //是因为3/2=1,有一个a^1要处理
a*=a;
b/=2;
}
return ans;
}

         

有一道思想一致的题:求a*b%p的结果,1<=a,b。p<=10^18。

比如11*16
16=2^4;
ans=11*2^4
 
代码如下:

long long zc(long long a,long long b,long long c){
long long ans=0;
while(b){
if(b&1==1)ans=(ans+a)%c;
a=(a+a)%c;
b/=2;
}
return ans;
}

 

















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

学习记录:快速幂

快速幂的求解-java方法(int范围之内)

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

快速幂:quickpow

算法学习快速幂

递归思想(钻出牛角尖)