Project Euler 39

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

p = 2lm(m + n)

だから、l, m, nを変えてpを配列でカウントする。


itertools.h

#include <iostream>
#include "itertools.h"

using namespace std;
using namespace itertools;

int main() {
    const int   N = 1000;
    vector<int> v(N + 1, 0);
    for(int m = 2; 2 * m * (m + 1) <= N; m++) {
        for(int n = m % 2 == 1 ? 2 : 1;  n < m; n += 2) {
            int q = 2 * m * (m + n);
            for(int l = 1; l * q <= N; l++)
                v[l*q]++;
        }
    }
    
    cout << fst(reduce1([] (tuple<int,int> x, tuple<int,int> y)
                        { return snd(x) >= snd(y) ? x : y; },
            zip(range<>(N + 1), iterable(v)))) << endl;
}