Project Euler

Problem 66

Problem 66 各 D (x, y は整数) を満たす最小の x を求め、それが最大となる D を求めよ、という問題。 最初は brute force で解こうとしたけど、D = 61 で詰まった。全然整数解が見つからない。 そこで、別の方法を探した。以下、その解法。

STL にも next_permutation があった

Scheme の permutations-for-each が役に立つ - EAGLE 雑記 と書いたけど、実は STL にも permutation が得られる関数があった。 それで Problem 43 を再び解いてみたところ、一瞬で解けた。 Gauche が遅いのか C++ が速いのか俺の書き方が悪いのか。 #inclu…

Problem 26 がやっと解けた

循環小数についての種々の考察 を参考にしてやっと解けた。 Problem 26 を解く上で重要なポイントは 純循環小数 1/n の循環節の長さ r は 10^r ≡ 1 (mod n) を満たす最小の r である ということ。 また、 既約分数 k/n が純循環小数である ⇔ n が 10 と互い…

Scheme の permutations-for-each が役に立つ

Problem 43 のように、このへんで pandigital number が頻出するようになる。 そんな問題たちを解くのに役に立ってくれるのが Scheme の permutations-for-each. 例えば Problem 43 では俺はこう解いた。おもいっきり brute force だけど、これ以外に思いつ…