また録画忘れちゃったよ。多分僕みたいな人のために予約録画機能があるんだろう。はやくHDDを手に入れなさいということだろうか。
しょうがないから弾さんのブログで問題を確認。弾さん、もうこの番組の解説においてデファクトスタンダードとなっていますね。
404 Blog Not Found : コマネチ大学数学科第12講 + javascript
問題:
1から1000までの番号とスイッチがついた電球があります。まず、1の倍数の電球のスイッチを押し、次に2の倍数のスイッチを押し….これを1000回行った後、点灯している電球の数はいくつあるでしょう?ただし、最初の状態では電球は消灯状態です。
約数(divisor)に着目すれば良いことはすぐに分かる。
- 約数が奇数個 → 最終的に点灯
- 約数が偶数個 → 最終的に消灯
となる。本来であれば弾さんのように証明を行わなければならないが、いくつか約数を書き出してみれば「どうやら平方数の約数は奇数だな」というのは見えてくるはずである。中村先生が直感的な説明をなさっていたということだが、おそらく「約数は対の構造になっているが、平方数だけ一組の対が同じ数同士なので、約数が一つ少なくなる」とかそういうことだろう。
プログラマにはお馴染みの32^2が1024なので、答えは31個ということになる。
Pythonで書くと以下のような感じかな。
comaneci12.py
def getdivisorcount(num): list = range(1,int(num / 2) + 1); divlist = [x for x in list if num % x == 0] devlist = divlist.append(num) return len(divlist) if __name__ == '__main__': list = [i for i in range(1,1001) if getdivisorcount(i) % 2 == 1] print 'The number of answers : %d' % (len(list)) for item in list: print item,
実行結果。
The number of answers : 31 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729 784 841 900 961
確かにプログラマ向けの問題でした。