快速幂学习随笔

在我们日常运算a^b时,可以通过循环b次得到结果,但显而易见的是

如果b的值很大,会超时,于是我们就用快速幂来计算a^b。

快速幂的基本思想是分治。

首先,a^b=a^b/2*a^b/2;如果我们算出了a^b/2再用乘法计算a,我们的

复杂度就可以减少一半,同理也可以得到a^b/2=a^b/4*a^b/4;这样不断

分治下去,最后b会得到1,我们可以通过递归实现这个过程,最后我

们可以把复杂度降到 O(logn)。

Code:

#include<cstdio>
#include<iostream>

using namespace std;

long long a,b;

int quickpow(int x,int y)
{
if(y==0) return 1; if(y==1) return x; if(y%2==0) { long long t=quickpow(x,y/2); return t*t; } else { long long t=quickpow(x,y/2); t=t*t; t=t*x; return t; } return 0; } int main() { cin>>a>>b; long long tot=quickpow(a,b); printf("%lld",tot); return 0; }

注意这里的b>=0,且b是整数;

如果b<0需要特殊处理或b是分数须再处理.

如果有取模运算的代码(洛谷P1226)

#include<cstdio>
#include<iostream>

using namespace std;

long long a,b;
int k;

int quickpow(int x,int y,int m)
{
    if(y==0) return 1%m;
    if(y==1) return x%m;
    if(y%2==0)
    {
        long long t=quickpow(x,y/2,m);
        return t*t%m;
    }
    else
    {
        long long t=quickpow(x,y/2,m);
        t=t*t%m;
        t=t*x%m;
        return t;
    }
    return 0;
}

int main()
{
    cin>>a>>b>>k;
    long long tot=quickpow(a,b,k);
    printf("%lld^%lld mod %d=%lld",a,b,k,tot);
    return 0;
}

蒟蒻的博客,大牛请指出不足。

猜你喜欢

转载自www.cnblogs.com/Hoyoak/p/10458879.html