admin 管理员组文章数量: 1184232
常见求幂方法——pow()函数
1 pow(_Tp __x, _Up __y) 2 { 3 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; 4 return pow(__type(__x), __type(__y)); 5 }
1 int Pow(int a,int b){ 2 3 int ans = 1; 4 5 for(int i = 0;i < b;i++){ 6 7 ans *= a; 8 9 } 10 11 return ans; 12 13 }
显而易见 时间复杂度 为 O(n);
这个时候 可以 采用 快速幂
求 a^b
一.分治 ———— 将 b 转成二进制 利用 转成以 2 为 底 的各个数 利用 同底数幂相乘 底数不变 指数相加 的规律 进行
eg. 3^11 将 十进制 11 转成 二进制 1011,
1011=2^3+2^1+2^0; 这时 3^11=3^(2^3+2^1+2^0) 按照 pow() 此时 需要 11个 3 相乘 即做 11 次 乘法 但是 转成二进制 之后只需要 进行 3 次乘法 时间复杂度 大大 降低
二进制 运算符
& 如果同时存在于两个操作数中,二进制 AND 运算符复制一位到结果中。
| 如果存在于任一操作数中,二进制 OR 运算符复制一位到结果中。 相当于 +1
^ 如果存在于其中一个操作数中但不同时存在于两个操作数中,二进制异或运算符复制一位到结果中。
~ 二进制补码运算符是一元运算符,具有"翻转"位效果,即0变成1,1变成0。
<< 二进制左移运算符。左操作数的值向左移动右操作数指定的位数。 相当于 ×4
>> 二进制右移运算符。左操作数的值向右移动右操作数指定的位数。 相当于 ÷4
具体 可见 https://blog.csdn/Sandwichsauce/article/details/79847525
1 #include<iostream> 2 #define ll long long 3 using namespace std; 4 5 ll qpow(ll a,ll b,ll mod){ 6 ll re=1; 7 while(b){ 8 if(b&1){ 9 re=(re*a)%mod; 10 } 11 b>>=1; 12 a=(a*a)%mod; 13 } 14 return re%mod; 15 }
https://wwwblogs/sun-of-Ice/p/9330352.html 扩展 第二种 方法
转载于:https://wwwblogs/jjjjjjy/p/11305248.html
本文标签: 快速
版权声明:本文标题:快速幂 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1763932168a3279681.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论