在求1~N-1
的逆元时,使用快速幂算法时时间复杂度为了O(nlog(n))
但是在N
超过1e6
时也是一样的会超时, 所以俺就记录一个线性的算法来求1~N-1
的逆元(O(n))
;
其中N必为质数
推导:
公式推导:现在求k的逆元(k必须为质数
令a * k + b = p
,
b ∗ inv[b] ≡ 1 (mod p)
(p − a * k) ∗ inv[b] ≡ 1 (mod p)
(p ∗ inv[b] − a * k ∗ inv[b]) ≡ 1 (mod p)
N
因为p ∗ inv[b] ≡ 0 (mod p)
得到−a * k * inv[b] ≡ 1 (mod p)
又因为b = p % k
ANDa * k + b = p
,所以a=p/k
(整除)
由b的表达式可以得到−a * k ∗ inv[p%k] ≡ 1 (mod p)
即−(p / k ) ∗ inv[p%k] ∗ k ≡ 1 (mod p)
所以有inv[k] = −(p/k) ∗ inv[p%k]
使用的时候加上p去掉负号
代码
int inv[N];
void ksm(int p)
{
inv[1] = 1;
for(int i = 2 ; i <= p - 1 ; i++)
{
inv[i] = (p-p / i) * inv[p % i] % p;
}
}
请问“又因为 b = p % kANDa * k + b = p,所以a=p/k(整除)”这句中的“整除”是根据电脑对数据直接向下取整功能来的吗?
收藏,我见过这个写法 ^_^!
我不会,收藏。waiting学习+1
## 刷题解刷到的,存个档
ovo!
最好写清楚 必须保证1~n必须与p互质
感谢提醒,忘了说N必为质数,求的是1~N-1的所有的逆元