2007-11-02 [長年日記]
>> [穴ゴル] Bronspeak 

Zrunspiel:
Shot lerkt shi vurlf-vodi qiliesi ig u mix bryptugrephod rystin dus sixv lissegit. Brecl shi budi unf empliminv xuas iwp angoni!
とのこと。……「とのこと」って!!
とりあえず問題文は読めた。で、読む必要がないことがわかった。
解けた。よかった。
二時間半かかったらしい。
>> [穴ゴル] Sphenic Numbers 締め切り 

「約数の数を使う」という基本アイデアはよかったんだけど、考察が足りなかった。
メモ。
Spenic Number は異なる素数 3 つの積として表わされる数だから、 その素数を a, b, c とすると、約数は
1 a b c ab ac bc abc
の 8 個。
ただし約数が 8 個であるのは、
- abc: (1, a, b, c, ab, ac, bc, abc): Sphenic Number
- ab^3: (1, a, b, ab, b^2, ab^2, b^3, ab^3)
- a^7: (1, a, a^2, a^3, a^4, a^5, a^6, a^7)
の 3 パターンがあるので、「約数が 8 個なら Spenic Number」とするわけには いかない。
kinaba さんのコードを見ると、
763.times{|n|p n if(2..n).select{|v|n%v<1&&n%v**3>0}[6]==n}
となっている。
n%v<1&&n%v**3>0 # v が n の約数で、その3乗が n の約数でない
なので、「『n の約数のうち、その3乗が n の約数でないもの』の 数がちょうど 7 個なら表示」となっている。
この条件で上記の 3 パターンを調べると
- abc: 7個 (a, b, c, ab, ac, bc, abc)
- ab^3: 6個 (a, ab, b^2, ab^2, b^3, ab^3)
- a^7: 5個 (a^3, a^4, a^5, a^6, a^7)
のように他の 2 パターンは排除できている……のだが、今度は
- a^10: (a^4, a^5, a^6, a^7, a^8, a^9, a^10)
というパターンが混入してしまう*1。
ただ、今回の課題は「Sphenic Number を小さい方から 100 個出力」で、 その最大値は 762 。一方 a^10 の最小値は 1024 (= 2^10) なので、 課題の範囲内で a^10 が混入してしまうことはない。
よって、上に引用したコードは pass する、と。
763.times{|n|(1..n).select{|d|n*n%d<-2[n%9*(n%4)]}[13]==n&&p(n)}
↓ # kinaba さんのに合わせて書き換え
763.times{|n|p n if(2..n).select{|d|n*n%d<-2[n%9*(n%4)]}[12]==n}
は、てきとーに試してみた
763.times{|n|p n if(2..n).select{|d|n*n%d<1}[12]==n}
「n^2 の約数のうち n より小さいものの数」が使えそうだったから 混入物を弾いたという話。なんでうまくいってるのか分からないので 説明とかはできません。
*1 a と b を使うパターンはない