zoukankan      html  css  js  c++  java
  • 快速幂基本模板

    快速幂,二进制思想,结合位运算使时间复杂度达到了O(logn)。

    如,设运算一个二进制为a^b, a为底数(不为0),b为幂数。

    若b = 14。

    b 的二进制代码为 14 -> 1 1 1 0 -> 2^3 + 2^2 + 2^1 + 0 = 14。

    这样, 我们就可以将a^14拆成了a^8  * a^4 * a^2 * 1。

    那么问题来了,如何实现呢?

    很简单,运用位运算,b&1 == 1 时进行乘法运算, 否则底数底数自乘达到自增的目的,而后 b >>= 1向后移一位直到b == 0返回答案ans

    下面上代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 #define ll long long
     4 
     5 using namespace std;
     6 //快速幂主体
     7 ll poww(ll a, ll b)
     8 {
     9     ll ans = 1, base = a;
    10     while(b != 0)
    11     {
    12         if(b&1 != 0)
    13             ans *= base; //实际上就是二进制思想,最末尾为1则乘底数的n-1次方,模拟。
    14         base *= base;
    15         b >>= 1;
    16     }
    17     return ans;
    18 }
    19 
    20 int main()
    21 {
    22     int T;
    23     scanf("%d", &T);
    24     while(T--)
    25     {
    26         ll n, a; scanf("%lld%lld", &n, &a);
    27         ll ans;
    28         ans = poww(n, a);
    29         printf("%lld
    ", ans);
    30     }
    31     return 0;
    32 }

    如有错误,欢迎评论指正!

    化繁为简 大巧不工
  • 相关阅读:
    引用的难点:函数返回值是引用(引用当左值)
    引用的意义与本质
    引用做函数参数
    Uva
    Uva
    Uva
    暑假集训-8.06总结
    暑假集训-8.05总结
    CH1801( 括号画家)
    最大异或对
  • 原文地址:https://www.cnblogs.com/mpeter/p/9527576.html
Copyright © 2011-2022 走看看