http://projecteuler.net/index.php?section=problems&id=129
1が続く数は、1からはじまって10倍して1を足すを繰り返します。そのnの剰余を計算するとき、最初に1が続く数を作るととてつもなく大きな数になってしまいます。そこで10倍して1を足してからnの剰余を取ることにします。そうすれば大きな数を計算することはありません。
nの剰余は割り切れない限り最大でもn-1個しかないので、A(n)が100万を超えるなら、100万2から調べればよいです。
本当はもっと速い方法があるのですが、それは次問で。
from itertools import * from fractions import gcd def iterate(f, x): while True: yield x x = f(x) def A(n): return next(k for k, m in izip(count(1), iterate(lambda x: (x * 10 + 1) % n, 1)) if m % n == 0) N = 10 ** 6 print next(n for n, a in ((n, A(n)) for n in count(N + 2) if gcd(n, 10) == 1) if a > N)