int main() { int tNum = 1, nNum = 1, divisors = 0, tNum2, exponent, i; uint64_t* p = malloc(sizeof(uint64_t)); *p = 65500; uint64_t* primes = sievePrimes(p); while (divisors <= 500) { nNum++; // next natural number tNum2 = tNum+=nNum; // next triangle number divisors = 1; // so we can *= for (i=0; i<*p; ++i) { if (primes[i]*primes[i] > tNum2) // current prime greater than sqrt(tNum), so it's last divisor and has multiple 1 { divisors*=2; // whatever it is, it'll multiply everything by (1+1)==2. don't need to actually find it break; } exponent = 1; // formula is (a_1+1)*(a_2+1)...(a_n+1), so start with the +1 while (tNum2 % primes[i] == 0) { ++exponent; tNum2 /= primes[i]; } if (exponent>1) divisors *= exponent; // multiply next term in formula if (tNum2 == 1) // check if we've fully factored our number break; } } printf("answer is %d\n", tNum); }
int main(){ uint64_t* P = sievePrimes(1000000); free(P); return 0; }