#!/usr/bin/python2.7 # encoding: utf-8 def answer(k, one = False): features = [] if one: features.append((k-1, )) for i in range(k): features.append((i, )) for i in range(k-1): features.append((i, i+1)) def dfs(F, L, I): if not F: yield L return ft, tail = F[0], F[1:] for M in dfs(tail, L, I): yield M if not set(ft) <= I: return I -= set(ft) for M in dfs(tail, L + [ft], I): yield M I |= set(ft) answer = 0 for S in dfs(features, [], set(range(k))): answer += (-1)**len(S) * 10**(k - sum([len(_) for _ in S])) return answer for i in range(20): print " %18d, /* k = %2d */" % (answer(i, False), i) print for i in range(20): print " %18d, /* k = %2d */" % (answer(i, True), i)