快速幂 快速乘 gcd

快速幂

 假设我们要求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左移一位,即x=x*2。

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(long long x,long long y,long long 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%p;
}

快速乘

与快速幂相似,当我们计算a*b时,如果a和b的乘积特别大,有的时候会溢出,即使是 long long 也会因结果过大而溢出,但同时结果会对一个long long范围内的数取余的时候,我们就需要用到快速乘。根据数学知识我们可以知道,乘法就是很多加法结合到一起,所以我们把乘法转化成加法,但一位一位加会超时,所以我们还是借用二进制来完成与快速幂同理,x*y就是y个x相加,所以和快速幂同理,2*4就是2+2+2+2四个二相加,2*11就是11个2相加2*23+2*21+2*20,所以同理,我们只需要把快速幂的乘法操作换成加法操作即可,记得取余哦!!!

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

gdc  最大公约数

最大公约数*最小公倍数=两整数的乘积

long long gcd(long long a,long long b)
{
if(b==0)
{
return a;
}
return gcd(b,a%b);
}

 

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