快速幂

快速幂   顾名思义   就是快速求幂的方法   再通俗的讲就是求 a^b  的快速方法


通常情况我们求a^b  就是求b个a相称  时间复杂度为O(n) 看起来已经很快了 只需遍历一遍就能求出结果  但是  这依旧不能满足我们的需求  我们希望有更快的方法来求得  a^b  结果  所以就有了快速幂


首先它的    时间复杂度是O(log₂N


方法是    将b转化为二进制的形式进行求解 a^b

以  b=11  为例   即 a^11


11的二进制是1011

11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1

因此,我们将a¹¹转化为  


这样原先需要11次运算方法就转换成了3次运算


代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <queue>
#include <map>
#define pi acos(-1.0)
#define inf 0x3f3f3f3f
#define linf 0x3f3f3f3f3f3f3f3fLL
#define ms(a,b) memset(a,b,sizeof(a))
#define ll long long
#define maxn 110
#define inf 0x3f3f3f3f
#define mod 100007
using namespace std;

ll Power(ll x,ll y)
{
    ll ret=1;
    ll base=x%mod;
    while(y)
    {
        if(y%2)// 将b逐位转化为二进制  并判断该为是0还是1   0则不需要乘进去
            ret=((ret%mod)*(base%mod))%mod;
        base=((base%mod)*(base%mod))%mod;//      求x的几次方
        y/=2;// 相当于将y的二进制右移一位
    }
    return ret%mod;
}
int main ()
{
    int a,b;
    scanf ("%d%d",&a,&b);
    printf ("%lld\n",Power(a,b));
    return 0;
}








将a^b   中的b转化为二进制形式后      求解的过程其实就是判断在b的每个二进制位上判断  a2^n   

是否需要乘进最终结果


1         0          1          1

a8       a4        a2        a1


当b的二进制位位0是   不需要乘

所以代码中的  a=a*a  的作用就是求a的几次方

另外 大数运算时  类型可以改为 long long  并在求a  和 tamp 时进行取模




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值