向前走莫回头❤

快速幂

快速幂

引言:在计算中,经常会进行乘方运算,而运用for循环的乘方运算[O(n)],在时间复杂度上可能不满足,因此我们引进快速幂[O(log2N)]来进行快速乘方运算.

原理:ap,将指数p按二进制拆分来实现ap次方。例:a13,(13)10 =(1101)2=1*20+0*21+1*22+1*23,因此a13=a2^0*a2^2*a2^3

递归式:

1 long long poww(long long x,int p){
2   if(p==0) return 1; 
3   if(p%2==1) return poww(x*x,p/2)*x;
4    else return poww(x*x,p/2);
5 }

位运算优化:

1 long long poww(long long x,int p){
2   if(!p) return 1; 
3   if(p&1) return poww(x*x,p>>1)*x;
4    else return poww(x*x,p>>1);
5 }

 

非递归式:

long long cf(long long x,int p){
   long long sum=1;
   while(p>0)
   {
      if(p%2==1) sum*=x;
      x*=x; p/=2;
   }
   return sum;
}

位运算优化:

1 long long cf(long long x,int p){
2   long long sum=1;
3   while(!p)
4    {
5      if(p&1) sum*=x;
6       x*=x; p>>=1;
7     }
8   return sum;
9 }

(有时在不要求全部位数或有特殊要求时可以mod大质数来加快运算或防止溢出)

posted @ 2018-08-09 17:15  lris0-0  阅读(211)  评论(0)    收藏  举报
过去的终会化为美满的财富~o( =∩ω∩= )m