$\newcommand{\O}{\mathrm{O}}$
$2 \sim n$ のすべての数の素因数分解を高速に行うアルゴリズム.
エラトステネスのふるいの要領で、素数を見つけたらその倍数を見ていき、その素数をいくつ因数として含むかを計算してやると良い.
時間計算量: $\O (n \log n)$
#define MAX_N 100000 // 2 〜 MAX_N-1のすべての数の素因数分解を計算(O(MAX_Nlog(MAX_N))) // pr[i]: i の素因数の配列 // id[i]: i の素因数 pr[i][j] の指数部分 vector<int> pr[MAX_N],id[MAX_N]; bool is_prime[MAX_N]; void all_fac() { fill(is_prime,is_prime+MAX_N,true); for(int i=2;i<MAX_N;i++){ if(is_prime[i]){ pr[i].push_back(i); id[i].push_back(1); for(int j=2*i;j<MAX_N;j+=i){ is_prime[j] = false; int cnt = 0; int nw = j; while(nw % i == 0){ nw /= i; cnt++; } pr[j].push_back(i); id[j].push_back(cnt); } } } }