大步小步(bsgs)算法详解

大步小步(Baby Step,Giant Step,BSGS)算法,用来求解类似于 a x ≡ b ( m o d a^x≡b(mod axb(mod p ) p) p)的问题,其中 a a a b b b p p p已经给出,本算法只能解决 p p p为素数的问题。

m = c e i l ( s q r t ( p ) ) m=ceil(sqrt(p)) m=ceil(sqrt(p)) x = i ∗ m − j x=i*m-j x=imj,则 a i ∗ m − j ≡ b ( m o d a^{i*m-j}≡b(mod aimjb(mod p ) p) p),同乘 a j a^j aj可得 ( a m ) i ≡ b ∗ a j ( m o d {(a^{m})}^{i}≡b*a^j(mod (am)ibaj(mod p ) p) p)

接下来考虑枚举所有的 j ∈ [ 0 , m − 1 ] j ∈ [0,m-1] j[0,m1],将 b ∗ a j b*a^j baj m o d mod mod p p p加入哈希表(可用map)中,再枚举 i ∈ [ 0 , m ] i ∈ [0,m] i[0,m],计算出 ( a m ) i {(a^{m})}^{i} (am)i m o d mod mod p p p,在哈希表中找出对应的 j j j并更新答案,这样 x x x就可以算出了,方程的解也可以求出。

时间复杂度 O ( s q r t ( p ) ) O(sqrt(p)) O(sqrt(p)) 1 0 16 10^{16} 1016以下都没有问题。

例题:abc270g,

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值