快速幂 快速乘 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);
}

浙公网安备 33010602011771号