题意:
有4正整数因子的自然数被称为preprime数。
求第n个preprime数。
思路:
可以得出结论,仅当某个数是两个素数的乘积或者是某个素数的3次方时为preprime。于是可以用类似素数筛法的方式,得到关于某数素因子数目的表(除自身外)。。
其实还可以更暴力,直接从2开始枚举,然后每个包含其作为因子的数的计数器加1。。。
const int MAX = 6000000;
int fac[MAX+1], tab[1000000+1];
class PreprimeNumbers
{
public:
PreprimeNumbers() {
init();
}
void init() {
int cnt = 0;
int i;
memset(fac, 0, sizeof(fac));
for (i=2;cnt < 1000000;++i) {
if (fac[i] == 2) {
fac[cnt++] = i;continue;
}
else if (fac[i] == 0) {
for (int j=i*2;j<=MAX;j += i) {
int t = j;
while (t%i == 0) {
t /= i;
++fac[j];
}
if (t == 1) --fac[j];
}
}
}
}
int nthNumber(int n)
{
return fac[n-1];
}
};