题目
小明正在进行积木的分销。他一共有N个积木,他要将它们分装到M个小包装内,每个小包装内至少有一个。如果一个小包装内含x个积木,那么这个小包装将会被定价为X2。小明想要控制一下价格,不希望价格太贵或者太便宜。他想要知道是否存在一种分装方案,使得分装后的M个小包装定价之和恰好为P。
如果有多种方案,输出字典序最小的那一个。对于两种不同方案{a1,a2,...,aM}与{b1,b2,...,bM},若对于1≤i≤t的i均有ai=bi,且at+1<bt+1,那么认为方案a的字典序小于方案b。
注意:当t=0时,没有合法的i存在,1≤i≤t只是限制i的范围。
例如,对于M=3,N=4的情况下,{1,1,2}的字典序小于{2,1,1} (对应t=0的情况) 、{1,2,1} (对应t=1的情况)。
代码
import itertools
def valid_partition(partition, p):
sum_squared = sum([x**2 for x in partition])
return sum_squared == p
def smallest_lexicographical(partitions):
smallest_partition = partitions[0]
for partition in partitions:
for i in range(len(smallest_partition)):
if partition[i] < smallest_partition[i]:
smallest_partition = partition
break
elif partition[i] > smallest_partition[i]:
break
return smallest_partition
n, m, p = map(int, input().split())
min_num_per_pack = 1
max_num_per_pack = n
valid_partitions = []
for partition in itertools.combinations_with_replacement(range(min_num_per_pack, max_num_per_pack+1), m):
if valid_partition(partition, p):
valid_partitions.append(partition)
if len(valid_partitions) == 0:
print(-1)
else:
smallest_partition = smallest_lexicographical(valid_partitions)
print(" ".join(str(x) for x in smallest_partition))