BSGS_Baby steps giant steps算法

BSGS这个主要是用来解决这个题:

 

A^x=B(mod C)(C是质数),都是整数,已知A、B、C求x。

在具体的题目中,C一般是所有可能事件的总数。

 

解:

m = ceil(sqrt(C))(ceil为上取整), x = i * m + j

那么A^x = (A^m)^i * A^j, (0 <= i < m, 0 <= j < m)

然后可以枚举iO(sqrt(C))级别的枚举。

 

对于一个枚举出来的i,令D = (A^m)^i现在问题转化为求D * A^j ≡ B (mod C)

如果把A^j当作一个整体,那么套上exgcd就可以解出来了(而且因为C是质数,A是C的倍数的情况容易特判,除此之外必有

(D, C) = 1,所以一定有解):exgcd求逆元,可以参考:http://www.cnblogs.com/PJQOOO/p/3873654.html

 

求出了A^j,现在的问题就是我怎么知道j是多少?

先用O(sqrt(C))的时间,将A^j全部存进hash表里面。然后只要查表就在O(1)的时间内知道j是多少了。

 

posted @ 2015-07-18 10:43  PJQOOO  阅读(396)  评论(0编辑  收藏  举报