Project Euler 145

プロジェクトオイラー
http://projecteuler.net/index.php

Q145.
ある正整数で、それとそれを10進で逆にした数の和の全ての桁が奇数のとき、reversibleと呼ぶ。10億未満のreversibleな数の個数。

桁数が偶数のとき、どの桁も反転した数字と足して奇数で、繰り上がらない。
桁数が奇数のとき、真ん中の桁は反転しても同じだから和は偶数。その下の桁の和は繰り上がる。その和が偶数なら、真ん中は繰り上がり。その下の桁はも同じことになって、いつまで経っても最後の桁だけ偶数にならない。よって、真ん中の下の桁の和は奇数。そうすると上の桁を考えて、その下の桁の和は偶数で繰り上がらない。このような並びで、桁数は4で割って3余らなければならない。



from itertools import repeat

N = 9
s = 0
for n in range(2, N + 1):
def mul(x, y): return x * y
if n % 4 == 3:
m = 5
for k in range(n / 2):
if k % 2 == 0:
m *= 20
else:
m *= 25
s += m
elif n % 2 == 0:
s += reduce(mul, repeat(30, n / 2 - 1), 20)
print s