求区间逆元

首先求的是1~n中间所有数的逆元,模数为m。

朴素算法

就是把区间中的所有逆元单个求出来,时间为 O ( n l o g n ) O(nlogn) O(nlogn)

递推算法

先把时间复杂度给出来: O ( n ) O(n) O(n)
设x的逆元为 f ( x ) f(x) f(x)
先来两个知识

1. f ( m − i ) = − f ( i ) f(m-i)=-f(i) f(mi)=f(i)

证明如下:
因为 f ( i ) ∗ i ≡ 1 ( m o d m ) f(i)*i≡1\pmod m f(i)i1(modm)
所以 f ( i ) ∗ ( − i ) ≡ − 1 ( m o d m ) f(i)*(-i)≡-1\pmod m f(i)(i)1(modm)
− f ( i ) ∗ ( m − i ) ≡ 1 ( m o d m ) -f(i)*(m-i)≡1\pmod m f(i)(mi)1(modm)
又因为 f ( m − i ) ∗ ( m − i ) ≡ 1 ( m o d m ) f(m-i)*(m-i)≡1\pmod m f(mi)(mi)1(modm)
所以 f ( m − i ) = − f ( i ) f(m-i)=-f(i) f(mi)=f(i)

2. f ( i ) ≡ k ∗ f ( k ∗ i ) ( m o d m ) f(i)≡k*f(k*i)\pmod m f(i)kf(ki)(modm)

证明如下:
因为 { f ( k ∗ i ) ∗ k ∗ i ≡ 1 ( m o d m ) f ( i ) ∗ i ≡ 1 ( m o d m ) \begin{cases}f(k*i)*k*i≡1\pmod m\\f(i)*i≡1\pmod m\end{cases} {f(ki)ki1(modm)f(i)i1(modm)
所以 f ( i ) ∗ i ≡ f ( k ∗ i ) ∗ k ∗ i ( m o d m ) f(i)*i≡f(k*i)*k*i\pmod m f(i)if(ki)ki(modm)
f ( i ) ≡ k ∗ f ( k ∗ i ) ( m o d m ) f(i)≡k*f(k*i)\pmod m f(i)kf(ki)(modm)

由以上两个知识可以得出 f ( n ) = ( f ( m % n ) ∗ ( m / n ) % m + m ) % m f(n)=(f(m\%n)*(m/n)\%m+m)\%m f(n)=(f(m%n)(m/n)%m+m)%m

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值