快速乘 解决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*20 其中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