快速幂
其实很好理解的,O(lg b)的时间复杂度,b是指数
我就大概说一下。
如果b = 11, 那么对应的二进制为1011,即答案
11的二进制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
那么就刚好一一对应
上代码(如果没有mod,数据很大,就要开高精度):
unsiged long long fastpow(unsigned long long a, unsigned long long b) { unsigned long long r = 1, t = a; //t先等于a,这样好算a^1,a^2,a^4...的,然后将结果乘上即可 while(b) { if(b & 1) //如果二进制末位有1,&是位运算与 r *= t; //有1,就将答案乘上t t *= t; //更新a^i b >>= 1; //向右移走一个1的位 } return r; }
如果题目有要mod的(即应该不用开高精度的):
int fastmodpow(int a, int b, int c) { int r = 1, t = a; while(b) { if(!r) break; //当r为0后,将来的任何乘以就无意义,所以退出 if(b & 1) r = (r * t) % c; //因为r和t都是mod过了的,所以在内部不用mod t = (t * t) % c; //因为t是mod过了的,所以在内部不用mod b >>= 1; } return r; }
博客地址:www.cnblogs.com/iwtwiioi 本文为博主原创文章,未经博主允许不得转载。一经发现,必将追究法律责任。