快速幂模版,(递归与非递归)

typedef long long ll;
//非递归

ll quick(ll a,ll b){
    ll s=1;

    while(b > 0){
        if( b&1 ) s *= a;    //如果b不是2的倍数,即b二进制此位为1,s则*=a
        b /= 2;            //b往下一位二进制数走
        a *= a;            //b走往下一位,a同理*=a;
    }

    return s;
}

//递归
ll quick(ll a,ll b){
    if(b==0) return 1;
    if(b==1) return a;
    ll s=quick(a,b/2);
    if(b&1) return s*s*a;
    else return s*s;
}
//与非递归类似;

//快速幂取模算法
//取模的一些公式
    (a*b) % m = (a % m) * (b % m) % m
    (a/b) % M = (a * b^(M-2)) % M;    //费马小定理
    (a+b) % M = (a % M+b % M) % M;

猜你喜欢

转载自blog.csdn.net/no_o_ac/article/details/81201318