58 lines
1.3 KiB
Python
58 lines
1.3 KiB
Python
try:
|
|
import psyco
|
|
psyco.full()
|
|
except:
|
|
pass
|
|
|
|
class Narcissistics:
|
|
def __init__(self, max_len):
|
|
self.max_len = max_len
|
|
self.power = [0] * 10
|
|
self.dsum = [0] * (max_len + 1)
|
|
self.count = [0] * 10
|
|
self.len = 0
|
|
self.ord0 = ord('0')
|
|
|
|
def check_perm(self, out = [0] * 10):
|
|
for i in xrange(10):
|
|
out[i] = 0
|
|
|
|
s = str(self.dsum[0])
|
|
for d in s:
|
|
c = ord(d) - self.ord0
|
|
out[c] += 1
|
|
if out[c] > self.count[c]:
|
|
return
|
|
|
|
if len(s) == self.len:
|
|
print self.dsum[0],
|
|
|
|
def narc2(self, pos, d):
|
|
if not pos:
|
|
self.check_perm()
|
|
return
|
|
|
|
while True:
|
|
self.dsum[pos - 1] = self.dsum[pos] + self.power[d]
|
|
self.count[d] += 1
|
|
self.narc2(pos - 1, d)
|
|
self.count[d] -= 1
|
|
if d == 0:
|
|
break
|
|
d -= 1
|
|
|
|
def show(self, n):
|
|
self.len = n
|
|
for i in xrange(len(self.power)):
|
|
self.power[i] = i ** n
|
|
self.dsum[n] = 0
|
|
print "length %d:" % n,
|
|
self.narc2(n, 9)
|
|
print
|
|
|
|
def main():
|
|
narc = Narcissistics(14)
|
|
for i in xrange(1, narc.max_len + 1):
|
|
narc.show(i)
|
|
|
|
main()
|