质因数分解总结

线性筛法

具体做法是在线性筛时预处理出一个fac数组来记录这个数的最小质因子,在分解时就可以递归求解

可以证明,此算法已经达到了分解因数的理论下界, 复杂度 \(O(log_n)\)

inline void sieve() {
  for (int i = 1; i < maxn; ++ i) fac[i] = i;
  for (int i = 2; i < maxn; ++ i) {
    if (fac[i] == i) p[++cnt] = i;
    for (int j = 1; j <= cnt && p[j] * i < maxn; ++ j) {
      if (fac[i * p[j]] = std::min(fac[i * p[j]], p[j]);
      if (i % p[j] == 0) break;
    }
  }
}

拭除法

具体做法是枚举 \(p_i (p_i <= n)\) 进行因数判断, 期望复杂度 \(O(n^{0.35})\)

复杂度相关证明参见

posted @ 2019-11-02 12:49  trswnca  阅读(214)  评论(0)    收藏  举报