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

 

posted @ 2019-02-19 21:13  千载煜  阅读(140)  评论(0编辑  收藏  举报