http://projecteuler.net/problem=27 f(n) = n * n + a * n + b f(n)が0 <= n <= dについて素数となるようaとbを定める(|a| < 1000, |b| < 1000)。このときdが最大となるaとbの積を求める。 {{{#!highlight c++ #include #include #include using namespace std; #define LIMIT (1000*1000) #define MAX 1000 bool isPrime[LIMIT]; vector primes; void init() { memset(isPrime, 1, sizeof(isPrime)); for (int i = 2; i < LIMIT; i++) { if (isPrime[i]) { if (i <= MAX) primes.push_back(i); for (int j = i+i; j < LIMIT; j+=i) { isPrime[j] = false; } } } } int len(int a, int b) { int n; for (n = 0; ; n++) { if (!isPrime[n * n + a * n + b]) return n - 1; } } int main() { init(); int max_len = 0; int ans = 0; // n = 0のとき式の値が素数となるので, bは素数 for (int i = 0; i < primes.size(); i++) { int b = primes[i]; for (int a = -999; a < 1000; a++) { int l = len(a, b); if (l > max_len) { ans = a * b; max_len = l; } } } cout << max_len << endl; cout << ans << endl; return 0; } }}}