码迷,mamicode.com
首页 > 其他好文 > 详细

快速幂

时间:2019-08-05 20:16:55      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:VID   同时存在于   define   异或运算   左移   log   i++   指定   rom   

常见求幂方法——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  扩展 第二种 方法

 

 

快速幂

标签:VID   同时存在于   define   异或运算   左移   log   i++   指定   rom   

原文地址:https://www.cnblogs.com/jjjjjjy/p/11305248.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!