Project Euler 29

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


この問題は、まともに計算すると大変なので、素因数分解を行う。そして、その結果をsetに入れていく。
入れていくのにF#のiterが便利なのでそれを作った。

template<typename T, typename U>
void iter(T& f, U& g) {
    while(g.exists_next())
        f(g.next());
}


itertools.h

#include <iostream>
#include <set>
#include "primes.h"

using namespace std;
using namespace itertools;
using namespace primes;

Facts pow_f(const Facts& f, int n) {
    return list(map([n] (Fact f)
                { return make_tuple(fst(f), snd(f) * n); },
                iterable(f)));
}

template<typename T, typename U>
void iter(T& f, U& g) {
    while(g.exists_next())
        f(g.next());
}

int main() {
    const int   N = 100;
    set<Facts>  s;
    iter([&s] (const Facts& f) { s.insert(f); },
            map([] (tuple<Facts,int> x)
                    { return pow_f(fst(x), snd(x)); },
            product(map([] (int n) { return list(factorize(n)); },
                    range<>(2, N + 1)), range<>(2, N + 1))));
    cout << s.size() << endl;
}