快速幂 快速乘

快速幂

 假设我们要求a^b,按照朴素算法就是把a连乘b次,这样一来时间复杂度是O(b),即是O(n)级别。但快速幂能做到O(logn)的复杂度。

 

1.&运算:通常用于二进制取位操作,例如一个数x,x&1的结果就是取x的二进制的最末位的数。还可以判断这个数的奇偶性,如果x&1==0,则认为x为偶数,如果x&1==1,则x为奇数。

2.>>运算:位运算符,代表右移几位,例如一个数x,x>>1就表示x右移一位,即x=x/2。

3.<<运算:位运算符,代表左翼几位,例如一个数x,x<<1就表示x左移一位,即

int mpow(int x, int y){     //计算机中y默认以二进制形式储存
    int ans=1;      //如果是0,0*任何数都是0
    for(int i=x; y; y>>1,i=i*i){    //y每次右移一位
        if(y&1){                       //判断y最后一位是否为1
            ans=ans*i;         //如果是1,代表系数c为1
        }
    }
    return ans;
}

如果结果相对p取余

long long mpow(int x,int y,int p){
    long long ans=1;
    for(long long i=x;     y;    y>>=1, i=(i*i)%p)  {
               if(y&1){           
                ans=(ans*i)%p;     
        }
    }
    return (ans);
}

快速乘

我们知道乘法其实就是把很多个加法运算合到一起。现在我们的乘法会爆范围,那我们就把它转化为加法。但是我们不可能一个一个的加,这样复杂度会是 O(n)O(n) 级别。所以我们模仿2进制加法操作来完成。

long long ksc(long long x, long long y, long long p){
     //计算x乘y的积
        long long res=0;           //因为是加法,所以从0开始
    for(int i=x;   y;   y>>=1,  i=(i+i)%p){
        if(y&1)
            res=(res+i)%p;
    }
    return res;
}

结束!!

 

posted @ 2020-04-26 14:11  kukudewen  阅读(131)  评论(0)    收藏  举报