快速乘法模板

快速乘 解决int64*int64%int64问题

移位快速乘,思想是把a*b%p中的b,对其进行二进制拆分,把b拆成二进制形式

a*b=ck-1*a*2k-1+ck-2*a*2k-2+ck-3*a*2k-3+....+c0*a*2其中c代码二进制位是否为1,我们只需要把b每次&1看最后一位是否为1,然后

把b/=2就保证每次最后一位一定是最新的,如果一旦最后一位非0,需要把当前权重加上去 ,初始a=a*1每次乘2后,a=a*2k  这样就能算出结果了

LL movemul(LL a,LL b,LL p){
   LL ans=0;
   for (;b;b>>=1){
       if (b&1)ans=(ans+a)%p;
       a=a*2%p;
   }
    return  ans;
}

O1快速乘,利用的是很简单的一个浮点数类型。long double能保证数字的精确程度,然后再把这个数字进行计算

计算的方式很简单,a*b%p=a*b-[a*b/p]*p

posted @ 2019-12-17 15:36  bluefly-hrbust  阅读(334)  评论(0编辑  收藏  举报