线性预处理逆元

求 1..n 之间每个数的逆元,如果都用费马小定理或者扩展欧几里得算,那么复杂度将会达到 $O(n \log p)$ 。利用一些递推式,可以线性地求出1..n中每个数的逆元,从而复杂度可以减少一个log。常用的一个递推公式是

$$i^{-1} = -\left\lfloor \frac{p}{i} \right\rfloor \cdot (p \bmod i)^{-1} \bmod p$$

这一公式的正确性也很好证明,等式右端可以写成(模p意义下)

$$-\frac{\left\lfloor \frac{p}{i} \right\rfloor}{p-\left\lfloor \frac{p}{i} \right\rfloor i} = \frac{1}{i}$$

利用此公式我们可以在 $O(n)$ 时间内求出1..n中每个数的逆元。

void init_inv()
{
    inv[1] = 1;
    for(int i = 2;i < n;i++)  inv[i] = (mod -  mod / i) * inv[mod % i] % mod;  //加mod不改变结果
}

 

 

参考链接:http://aequa.me/index.php/tag/lagrange-interpolation/

 

转载于:https://www.cnblogs.com/lfri/p/11188923.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值