http://projecteuler.net/index.php?section=problems&id=44
とても遅い。確か逆から考えたほうが速いはず。
#include <iostream> #include <cmath> #include "itertools.h" using namespace std; using namespace itertools; long long P(int n) { return n * (3 * n - 1) / 2; } bool is_pentagonal(long long n) { int m = (int)sqrt((double)(1 + 24 * n)); return m * m == 1 + 24 * n && m % 6 == 5; } bool is_diff_penta(int D) { for(int j = 1; 3 * j + 1 <= D; j++) { long long Pj = P(j); if(is_pentagonal(D + Pj) && is_pentagonal(D + Pj * 2)) return true; } return false; } int main() { cout << head(filter(is_diff_penta, map([] (long long i) { return (int)P(i); }, itertools::count<long long>(1)))) << endl; }