快速幂

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  扩展 第二种 方法

 

 

以上是关于快速幂的主要内容,如果未能解决你的问题,请参考以下文章

算法初步:快速乘,快速幂,矩阵快速幂

关于快速幂快速乘矩阵快速幂

求幂大法,矩阵快速幂,快速幂模板题--hdu4549

快速幂与矩阵快速幂

快速幂详解

快速幂与矩阵快速幂