#!/usr/bin/env python
def print_ages(kids_ages):
""" Print kids ages, ignore 0 that are towards the end in the kids_ages array """
for age in kids_ages:
if age == 0: break
print age,
print
def check_ages(kids_ages):
""" Check age constraint, ignore 0 that are towards the end in the kids_ages array """
s = 0
p = 1
# compute sum of ages and product of ages
for age in kids_ages:
if age == 0: break
s += age
p *= age
# check for constraint sum^2 = product (of ages)
if s*s == p:
return True
else:
return False
def find_ages(kids_ages, num_kids):
if num_kids == 0:
least_age = 13
else:
# check kids ages
if check_ages(kids_ages):
print "Ages that satisfy constraint:",
print_ages(kids_ages)
# david has less than 7 kids
if num_kids >= 7:
return
# pick the smallest age
least_age = kids_ages[num_kids-1]
# add kid with different ages to kids_ages
for age in xrange(2, least_age):
# add a kid with age = age
kids_ages[num_kids] = age
# find age recursively
find_ages(kids_ages, num_kids+1)
# undo the added kid
kids_ages[num_kids] = 0
kids_ages = [0 for i in xrange(0,7)]
find_ages(kids_ages, 0)
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCgpkZWYgcHJpbnRfYWdlcyhraWRzX2FnZXMpOgogICAgIiIiIFByaW50IGtpZHMgYWdlcywgaWdub3JlIDAgdGhhdCBhcmUgdG93YXJkcyB0aGUgZW5kIGluIHRoZSBraWRzX2FnZXMgYXJyYXkgIiIiCiAgICBmb3IgYWdlIGluIGtpZHNfYWdlczoKICAgICAgICBpZiBhZ2UgPT0gMDogYnJlYWsKICAgICAgICBwcmludCBhZ2UsCiAgICBwcmludAoKZGVmIGNoZWNrX2FnZXMoa2lkc19hZ2VzKToKICAgICIiIiBDaGVjayBhZ2UgY29uc3RyYWludCwgaWdub3JlIDAgdGhhdCBhcmUgdG93YXJkcyB0aGUgZW5kIGluIHRoZSBraWRzX2FnZXMgYXJyYXkgIiIiCiAgICBzID0gMAogICAgcCA9IDEKICAgIAogICAgIyBjb21wdXRlIHN1bSBvZiBhZ2VzIGFuZCBwcm9kdWN0IG9mIGFnZXMKICAgIGZvciBhZ2UgaW4ga2lkc19hZ2VzOgogICAgICAgIGlmIGFnZSA9PSAwOiBicmVhawogICAgICAgIHMgKz0gYWdlCiAgICAgICAgcCAqPSBhZ2UKICAgIAogICAgIyBjaGVjayBmb3IgY29uc3RyYWludCBzdW1eMiA9IHByb2R1Y3QgKG9mIGFnZXMpCiAgICBpZiBzKnMgPT0gcDoKICAgICAgICByZXR1cm4gVHJ1ZQogICAgZWxzZToKICAgICAgICByZXR1cm4gRmFsc2UKICAgIApkZWYgZmluZF9hZ2VzKGtpZHNfYWdlcywgbnVtX2tpZHMpOgogICAgaWYgbnVtX2tpZHMgPT0gMDoKICAgICAgICBsZWFzdF9hZ2UgPSAxMwogICAgZWxzZToKICAgICAgICAjIGNoZWNrIGtpZHMgYWdlcwogICAgICAgIGlmIGNoZWNrX2FnZXMoa2lkc19hZ2VzKToKICAgICAgICAgICAgcHJpbnQgIkFnZXMgdGhhdCBzYXRpc2Z5IGNvbnN0cmFpbnQ6IiwKICAgICAgICAgICAgcHJpbnRfYWdlcyhraWRzX2FnZXMpCiAgICAgICAgCiAgICAgICAgIyBkYXZpZCBoYXMgbGVzcyB0aGFuIDcga2lkcwogICAgICAgIGlmIG51bV9raWRzID49IDc6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIAogICAgICAgICMgcGljayB0aGUgc21hbGxlc3QgYWdlIAogICAgICAgIGxlYXN0X2FnZSA9IGtpZHNfYWdlc1tudW1fa2lkcy0xXQogICAgICAgIAogICAgIyBhZGQga2lkIHdpdGggZGlmZmVyZW50IGFnZXMgdG8ga2lkc19hZ2VzCiAgICBmb3IgYWdlIGluIHhyYW5nZSgyLCBsZWFzdF9hZ2UpOgogICAgICAgICMgYWRkIGEga2lkIHdpdGggYWdlID0gYWdlCiAgICAgICAga2lkc19hZ2VzW251bV9raWRzXSA9IGFnZQogICAgICAgIAogICAgICAgICMgZmluZCBhZ2UgcmVjdXJzaXZlbHkKICAgICAgICBmaW5kX2FnZXMoa2lkc19hZ2VzLCBudW1fa2lkcysxKQogICAgICAgIAogICAgIyB1bmRvIHRoZSBhZGRlZCBraWQKICAgIGtpZHNfYWdlc1tudW1fa2lkc10gPSAwCgpraWRzX2FnZXMgPSBbMCBmb3IgaSBpbiB4cmFuZ2UoMCw3KV0KZmluZF9hZ2VzKGtpZHNfYWdlcywgMCk=