リニアふるいです
事前スクリーニング線形ときに行われるfac
素因数の最小数を記録するためのアレイは、分解時に再帰的に解くことができます
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;
}
}
}