快速幂及龟速乘

快速幂

关于幂运算
一般只会起循环暴力乘起来,这样复杂度会不会让人堪忧
虽然暴力乘也可以取模,但这样会不会慢呢
所以这就引来了快速幂取模运算(也可以不取模,仅加速)

#define ll long long
const int mod=1e9+7;
ll qpow(ll b,ll p) {//关于long long的话随便
    ll a=1;
    while(p) {
        if(p&1) {//if(p%2==0)
            a=a*b;//处理答案
            //a%=mod;取模
        }
        b=b*b;//自乘(暴力乘)
        //b%=mod;取模
        p>>=1;//降幂p/=2;
    }
    return a%mod;
}

龟速乘

关于这个把O(1)变成O(logn)的玩意还是不能不要
毕竟谁也不想正数乘出负数

#define ll long long
const int mod=1e9+7;
ll qmul(ll b,ll p) {
    ll a=0;//不同
    while(p) {
        if(p&1) {
            a=a+b;//不同
            //a%=mod;
        }
        b=b+b;//不同
        //b%=mod;
        p>>=1;
    }
    return a%mod;
}


我也感觉它俩很像
所以你就直接用就行了

bye bye

posted @ 2022-01-25 08:29  双枫  阅读(38)  评论(2编辑  收藏  举报