P1226快速幂取余
链接:https://www.luogu.org/problemnew/show/P1226
什么是快速幂啊?
就是一个能让乘方运算的复杂度到O(logn)的东西
咋做到的呢?
如果我们要算ab,那么我们先把b进行二进制分解
举个例子好了
当b=5时,b=101,即ab=a1*a4
这样,我们只用算出a1和a4,然后再进行一次乘法运算即可,其中a4=(a2)2
也就是说,遍历b的二进制表示的每一位(从低位到高位),如果该位是0,则a自身平方,如果是1,则ans*=a
代码
int ksm(int a,int b) { int r=1; while(b) { if(b&1) r=(r*a)%mod;//b&1即当前位是1 a=(a*a)%mod; b>>=1;//b右移一位,即遍历b的二进制表示的下一位 } return r; }
有关位运算的东西
a&b:a,b若有一个为0,则都为0
a|b:有一个为1,则为1
a^b(异或):相同为0,不同为1
a^=b^=a^=b:交换a,b