求x的所有质因子,时间复杂度$O(\sqrt x)$;

如果求n个数的质因子(每个数不超过x),时间复杂度$O(n \sqrt x)$

vector<int> fac;
for (int j = 2; j * j <= x; j++) {
    if (x % j)
        continue;
    fac.push_back(j);
    while (x % j == 0)
        x /= j;
}
if (x!=1) fac.push_back(x);

使用线性筛,预处理出不超过x的每个数的最小质因子。

求x的所有质因子,时间复杂度$O(x + log x)$;

如果求n个数的质因子(每个数不超过x),时间复杂度$O(x + nlogx)$

vector<int> p;
int lpf[N]; 

void sieve() {
    lpf[1] = 1;
    for (int i = 2; i < N; i++) {
        if (lpf[i] == 0) {
            lpf[i] = i;
            p.push_back(i);
        }
        for (int j = 0; p[j] * i < N; j++) {
            lpf[p[j] * i] = p[j];
            if (i % p[j] == 0) {
                break;
            }
        }
    }
    // for (int i : p) {
    //     cout << i << "\\n";
    // }
    // for (int i = 1; i < N; i++) {
    //     cout << i << " " << lpf[i] << "\\n";
    // }
}

vector<int> fac;
while (lpf[x] != 1) {
    if (fac.empty() || fac.back() != lpf[x])
        fac.push_back(lpf[x]);
    x /= lpf[x];
}