from itertools import accumulate
from functools import reduce
from operator import mul
def Partition(n, m, L=[]):
if m == 1 and n:
yield [n]+L
else:
for i in range(1, n):
yield from Partition(n-i, m-1, [i]+L)
def MAX_product(N, K):
N_str = str(N)
n = len(N_str)
if n < K - 1:
print('K too large.')
return (-1, [])
R = []
for p in Partition(n, K+1):
L = [ 0 ] + list(p)
pa = list(accumulate(L))
Numbers = list(map(int, (N_str[a:b] for a, b in zip(pa, pa[1:]))))
Product = reduce(mul, Numbers, 1)
R.append((Product, Numbers))
return sorted(R, key=lambda t: t[0])[-1]
P1, L1 = MAX_product( 746589, 2)
print(P1, '=', ' x '.join(map(str, L1)))
P2, L2 = MAX_product(1111114, 3)
print(P2, '=', ' x '.join(map(str, L2)))
CmZyb20gaXRlcnRvb2xzIGltcG9ydCBhY2N1bXVsYXRlCmZyb20gZnVuY3Rvb2xzIGltcG9ydCByZWR1Y2UKZnJvbSBvcGVyYXRvciAgaW1wb3J0IG11bAoKZGVmIFBhcnRpdGlvbihuLCBtLCBMPVtdKToKICAgIGlmIG0gPT0gMSBhbmQgbjoKICAgICAgICB5aWVsZCBbbl0rTAogICAgZWxzZToKICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCBuKToKICAgICAgICAgICAgeWllbGQgZnJvbSBQYXJ0aXRpb24obi1pLCBtLTEsIFtpXStMKQoKZGVmIE1BWF9wcm9kdWN0KE4sIEspOgogICAgTl9zdHIgPSBzdHIoTikKICAgIG4gPSBsZW4oTl9zdHIpCiAgICBpZiBuIDwgSyAtIDE6CiAgICAgICAgcHJpbnQoJ0sgdG9vIGxhcmdlLicpCiAgICAgICAgcmV0dXJuICgtMSwgW10pCgogICAgUiA9IFtdCiAgICBmb3IgcCBpbiBQYXJ0aXRpb24obiwgSysxKToKICAgICAgICBMID0gWyAwIF0gKyBsaXN0KHApCiAgICAgICAgcGEgPSBsaXN0KGFjY3VtdWxhdGUoTCkpCiAgICAgICAgTnVtYmVycyA9IGxpc3QobWFwKGludCwgKE5fc3RyW2E6Yl0gZm9yIGEsIGIgaW4gemlwKHBhLCBwYVsxOl0pKSkpCiAgICAgICAgUHJvZHVjdCA9IHJlZHVjZShtdWwsIE51bWJlcnMsIDEpCiAgICAgICAgUi5hcHBlbmQoKFByb2R1Y3QsIE51bWJlcnMpKQoKICAgIHJldHVybiBzb3J0ZWQoUiwga2V5PWxhbWJkYSB0OiB0WzBdKVstMV0KClAxLCBMMSA9IE1BWF9wcm9kdWN0KCA3NDY1ODksIDIpCnByaW50KFAxLCAnPScsICcgeCAnLmpvaW4obWFwKHN0ciwgTDEpKSkKClAyLCBMMiA9IE1BWF9wcm9kdWN0KDExMTExMTQsIDMpCnByaW50KFAyLCAnPScsICcgeCAnLmpvaW4obWFwKHN0ciwgTDIpKSkK