取模这种东西到底还是好,将广大OIER从高精度的深渊中解放出来
但是,取模也不总是那么方便的
比方说,我们的操作中不可避免地出现了除法
大部分时候题目会告诉我们取模的数是质数,或者至少除数和取模的数互质,这样我们就能用欧拉定理来解决这个问题了
然而,不幸的事终还是发生了
这道题所要求的取模的数就是任意的~~
题目本身不难,从后往前按位统计+树状数组即可,但由于可重排列公式中不可避免地出现了除法,怎么办?
盾哥从这个题的标程中抠出了下面这个不太优美的方法
先将要取模的数分解质因数,然后每次要乘或要除一个数的时候,就将那个数的质因子中跟取模的数的相同的提出来,这部分因子“暴力”(就是有除法就直接约分,要用的时候再快速幂算值),另外的部分就和要取模的数互质了,可以直接求其乘法逆元
由于一个数的质因数个数是log级别的,所以通过一大堆预处理可以让取模过程均摊O(logN)
可是,算法常数还是非常大,怎么办呢?
我想了一个比较有效的常数优化,就是算一个数的乘法逆元可以“记忆化”,加入这个优化程序能快上将近一倍
感觉算法不太优美,求更漂亮的实现~~
代码:
速度比盾哥快,哈哈~