(扩展)BSGS学习笔记

现有同余方程

axb(mod p) a x ≡ b ( m o d   p )

其中 (a,p)=1 ( a , p ) = 1
如果暴力枚举 x x 的话,根据欧拉定理
aφ(p)1(mod p)

效率是 O(p) O ( p )
现在我们考虑分块,设 m=p,1jm m = ⌈ p ⌉ , 1 ≤ j ≤ m
那么原式可以表示为
aimjb(mod p) a i m − j ≡ b ( m o d   p )


aimbaj(mod p) a i m ≡ b a j ( m o d   p )

我们可以把 baj b a j 的值存储下来,枚举 i i 的时候询问是否存在这样一个j,这样就可以做到 O(p) O ( p )
如果 (a,p)>1 ( a , p ) > 1 ,这个方法就行不通了,因为 aimbaj(mod p) a i m ≡ b a j ( m o d   p ) 推回 aimjb(mod p) a i m − j ≡ b ( m o d   p ) 时需要两端同除以 aj a j ,而 gcd(a,p)>1 g c d ( a , p ) > 1 时就不能这样做了.
考虑对 a,b,p a , b , p 进行处理,设 g=(a,p) g = ( a , p ) ,那么
ax1(ag)bg(mod pg) a x − 1 ( a g ) ≡ b g ( m o d   p g )

ax1bg(ag)1(mod pg) a x − 1 ≡ b g ( a g ) − 1 ( m o d   p g )

新的 b b 就是bg(ag)1
新的 p p 就是pg
不断如此进行操作,记录最终操作次数,答案就是最后 a,b,p a , b , p 的答案加上操作次数,此外我们还需要暴力检验小于等于操作次数的答案
Code(bzoj2480)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值