快速幂
快速幂
引言:在计算中,经常会进行乘方运算,而运用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大质数来加快运算或防止溢出)
既然无能更改,又何必枉自寻烦忧

浙公网安备 33010602011771号