templates/sieve-prime-factors.cpp
compilable
$cat templates/sieve-prime-factors
Sieve + Prime Factors
Sieve Prime Factors — SPF + Fast Factorization
#Sieve#Prime-Factors
Log in to track progress, save custom versions, and organize into collections.Log In
$cat source_code/
cpp
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
vector<int> SPF;
vector<vector<int>> primeFactors;
vector<int> prime_factors(int x) {
vector<int> ret;
while (x > 1) {
ret.push_back(SPF[x]);
x /= SPF[x];
}
return ret;
}
void build_spf(int N) {
SPF = vector<int>(N + 5);
primeFactors = vector<vector<int>>(N + 5);
for (int i = 1; i <= N; i++) {
SPF[i] = i;
}
for (int i = 2; i <= N; i += 2) {
SPF[i] = 2;
}
for (int i = 3; i * i <= N; i++) {
if (SPF[i] == i) {
for (int j = i * i; j <= N; j += i) {
if (SPF[j] == j) {
SPF[j] = i;
}
}
}
}
for (int i = 1; i <= N; i++) {
primeFactors[i] = prime_factors(i);
}
}
void Solve() {
// write your code here
}
int main() {
ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
int t = 1;
// cin >> t;
while (t--) Solve();
return 0;
}55 linesutf-8
$cat explanation_notes.md
notes_viewer --renderedmarkdown (math enabled)
Sieve Prime Factors — SPF + Fast Factorization
Quick Start (ECPC)
void Solve()
{
int n; cin >> n;
build_spf(n); int q; cin >> q;
while (q--) {
int x; cin >> x;
auto pf = prime_factors(x); // {2, 2, 2, 3, 3, 5} for 360
for (auto p : pf) cout << p << " ";
cout << "\n";
}
}
Functions
build_spf(N) — build SPF[] and primeFactors[] for 1..Nprime_factors(x) — returns vector, prime factors of xGlobals
SPF[i] — smallest prime factor of iprimeFactors[i] — precomputed prime factors of iNotes
build_spf(N) once at the start.prime_factors(x) runs in O(log x) using SPF.