Project Euler 44

http://projecteuler.net/index.php?section=problems&id=44


とても遅い。確か逆から考えたほうが速いはず。


itertools.h

#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;
}