之前没听说过,原来就是个根号分治。
求这样的方程:

其中已知, 是质数。

做法

  • 考虑对于所有的 插入一个Hash表

    int m = ceil(sqrt(p));
    int val = n % p;
    for (int j = 0; j <= m; j++) {
      mp[val] = j;
      val *= b;
      val %= p;
    }
  • 枚举 ,计算出 ,在Hash表中查找是否存在对应的 并更新答案,这样就得出了 ,又因为 已知,所以可以求出方程的解 .

    int bm = qpow(b, m);
    val = bm;
    for (int i = 1; i <= m; i++) {
      if (mp.count(val)) {
        int ans = i * m - mp[val];
        if (ans >= 0) {
          cout << ans << endl;
          return;
        }
      }
      val *= bm;
      val %= p;
    }

添加新评论

文章目录