快速幂

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

 

 

转载于:https://www.cnblogs.com/jjjjjjy/p/11305248.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值