快速幂

快速幂

a^b%p=??

 暴力O(b)      当然不可以!!
 
两种解决思路: 
• 分治
• 快速幂
 
 
 

快速幂(正常操作)

举个例子:

计算

a^7      把它拆分:a^7 = a^1 * a^2 * a^4
a^11    把它拆分:a^11 = a^1 * a^2 * a^8
a^25    把它拆分:a^25 = a^1 * a^8 * a^16
 
首先计算出 a^1、 a^2、 a^4、 a^8 …
 
观察后发现可以把那要计算的幂分解成二次方的形式,如果b是奇数的话,最后乘以单个a就好啦
 

代码:

int quickpow(int a,int b,int n)
{
    int ans=1;

    while(b)
    {
        if(b%2==1)
        ans=ans*a%n;
        a=a*a%n;
        b/=2;
    }

    return ans;
}

 强烈安利,因为好写 

分治

比如求3^5

也就是由3^2 , (3^2)^2 , 最后(3^2)^2*2得来

。。。其实就是递归了一下。。。和上面的方法没有本质区别

代码:

int calc(int a,int b,int c)
{
    if(b==1)  return a;

    int tmp=calc(a,b/2,c);

    tmp=tmp*tmp%c;

    if(b%2==1)  tmp=tmp*a%c;

    return tmp;
 } 
原文地址:https://www.cnblogs.com/xiaoyezi-wink/p/10656921.html