快速幂 快速乘
快速幂
假设我们要求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; }
结束!!

浙公网安备 33010602011771号