SRM307 div2 difficult

実践では1000000のときの数が分からないので、MAX = 5200000とかいうことはできないと思ってもよい。

#define MAX 12924368  //これを超えたらbad_allocがでた。最大値でも1.90sくらいで間に合う。
int preprime[MAX] = {0};

//エラトステネスを改良。
class PreprimeNumbers {
public:
  int nthNumber(int n) {
    for(int i = 2, count = 0; i < MAX; i++) {
			int tmp = (int)cbrt(i+0.5);
      if(fabs(cbrt(i) - tmp) < eps && preprime[tmp] == 0) {
				count++;
      } else {
//preprime[i]が0でないなら素数ではないから、preprime[i]*(整数倍)はpreprimeではない。
//計算が無駄になるので、その時は計算を飛ばす。
//具体的には、preprime[i] == 1のとき、preprime[i*j] > 4にして、
二度とfor文を使わないようにすればいいんじゃない?ということ。
				int flag = (preprime[i] == 0) ? 1 : 3;
				if(preprime[i] <= 1) {
					for(int j = i*2; j < MAX; j += i) {
						preprime[j] += flag;
					}
				} 
				if(preprime[i] == 2) count++;
			}
			if(count == n) return i;
    }
    return -1;
  }