(扩展)BSGS学习笔记

版权声明: https://blog.csdn.net/qq_16267919/article/details/81989770

现有同余方程

a x b ( m o d   p )

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

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


a i m b a j ( m o d   p )

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

a x 1 b g ( a g ) 1 ( m o d   p g )

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

猜你喜欢

转载自blog.csdn.net/qq_16267919/article/details/81989770