快速幂
Posted jjjjjjy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速幂相关的知识,希望对你有一定的参考价值。
常见求幂方法——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.net/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://www.cnblogs.com/sun-of-Ice/p/9330352.html 扩展 第二种 方法
以上是关于快速幂的主要内容,如果未能解决你的问题,请参考以下文章