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