1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
///类似于动态规划的记忆化搜索
// 求取小于等于n的所有质数
// 并求取所有合数的质因子
vector<bool> isPrime(n+1, true);
vector<vector<int>> factor(n+1);

for (int i = 2; i <= n; i++)
{
// 查看i是否是质数
// 不是质数,则下一个
if (!isPrime[i]) continue;

// i是质数
// 遍历i的所有倍数,其倍数必定不是质数,并记录对应的质因子i
int m = 2;
while ((m * i) <= n)
{
int cur = m * i;
isPrime[cur] = false;
factor[cur].push_back(i);
m++;
}
}