POJ 2417 Discrete Logging 离散对数
链接: http://poj.org/problem?id=2417 题意: 思路:求离散对数,Baby Step Giant Step算法基本应用。 下面转载自: AekdyCoin 【普通Baby Step Giant Step】 【问题模型】 求解 A^x = B (mod C) 中 0 <= x < C 的解,C 为素数 【思路】 我们能够做一个等价 x = i * m + j ( 0 <= i < m, 0 <=j < m) m = Ceil ( sqrt( C) ) 而这么分解的目的无非是为了转化为: (A^i)^m * A^j = B ( mod C) 之后做少许暴力的工作就能够解决这个问题: (1) for i = 0 -> m, 插入Hash (i, A^i mod C) (2) 枚举 i ,对于每个枚举到的i,令 AA = (A^m)^i mod C 我们有 AA * A^j = B (mod C) 显然AA,B,C均已知,而因为C为素数,那么(AA,C)无条件为1 于是对于这个模方程解的个数唯一(能够利用扩展欧几里得或 欧拉定理来求解) 那么对于得到的唯一解X,在Hash表中寻找,假设找到,则返回 i * m + j 注意:因为i从小到大的枚举,而Hash表中存在的j必定是对于某个剩余系内的元素X 是最小的(就是指标) 所以显然此时就能够得到最小解