快速幂取模

基于二分及位操作,用来快速求a的n次方对M取模,时间复杂度为O(logn)相比常规方法O(n)有极大提升

其原理为把a^n分为a^(n/2)*a^(n/2)。并一直二分下去

代码:

typedef long long LL;

递归:

LL emo(LL a,LL n,LL M)         //计算a^n%M
{
    if(n==0) return 1;
    if(n==1) return a%M;
    LL t=emo(a,n>>1,M);
    if(n&1) return t*t*a%M;
    else return t*t%M;
}
循环:

LL emo(LL a,LL n,LL M)
{
    LL r=1;
    while(n>0)
    {
        if(n&1) r=r*a%M;
        a=a*a%M;
        n=n>>1;
    }
    return r;
}

posted @ 2013-07-31 15:44  Netop  阅读(138)  评论(0)    收藏  举报