from itertools import product, combinations_with_replacement
import threading
# 配置参数(可根据需要修改)
TARGET = 228774 # 目标值
MIN_PRODUCT = 74000 # 单个乘积的最小值
MAX_PRODUCT = 115000 # 单个乘积的最大值
VALUES = [35,40.5,58,67,73,90.5] # 系数列表
MAX_VARS = 3 # 最多使用的变量数
SOLVER_TIMEOUT = 30 # 每个求解器的超时时间(秒)
def is_valid_product(p):
"""检查单个乘积是否在有效范围内"""
return MIN_PRODUCT <= p <= MAX_PRODUCT
def find_single_variable_solutions():
"""查找单个数的解(a*x = TARGET)"""
solutions = []
for a in VALUES:
x = TARGET / a
if x.is_integer() and 1 <= x <= 10000 and is_valid_product(a * x):
solutions.append((a, x))
return solutions
def find_two_variable_solutions():
"""查找两个数的解(a*x + b*y = TARGET)"""
solutions = []
for a, b in product(VALUES, repeat=2):
if a == b: # 避免重复组合
continue
max_x = int((TARGET - MIN_PRODUCT) / a)
for x in range(1, max_x + 1):
ax = a * x
if not is_valid_product(ax):
continue
remainder = TARGET - ax
if remainder < MIN_PRODUCT:
continue
y = remainder / b
if y.is_integer() and 1 <= y <= 10000 and is_valid_product(b * y):
solutions.append((a, x, b, y))
return solutions
def find_three_variable_solutions():
"""查找三个数的解(a*x + b*y + c*z = TARGET)"""
solutions = []
for a, b, c in combinations_with_replacement(VALUES, 3):
# 确保三个数不全相同,减少重复计算
if len({a, b, c}) == 1:
continue
max_x = int((TARGET - 2 * MIN_PRODUCT) / a)
for x in range(1, max_x + 1):
ax = a * x
if not is_valid_product(ax):
continue
remainder1 = TARGET - ax
if remainder1 < 2 * MIN_PRODUCT:
continue
max_y = int((remainder1 - MIN_PRODUCT) / b)
for y in range(1, max_y + 1):
by = b * y
if not is_valid_product(by):
continue
remainder2 = remainder1 - by
if remainder2 < MIN_PRODUCT:
continue
z = remainder2 / c
if z.is_integer() and 1 <= z <= 10000 and is_valid_product(c * z):
solutions.append((a, x, b, y, c, z))
return solutions
def find_balanced_solutions(solutions, var_count):
"""从所有解中筛选出最平衡的解"""
if var_count == 1:
return solutions # 单变量无需平衡筛选
# 计算解的平衡性(变量间差异最小)
balanced = []
for sol in solutions:
vars = sol[1::2] # 提取x, y, z
diff = max(vars) - min(vars)
balanced.append((diff, sol))
# 按差异排序,取前5个
return [s for _, s in sorted(balanced, key=lambda x: x[0])[:5]]
def run_with_timeout(func, args=(), kwargs=None, timeout=SOLVER_TIMEOUT):
"""运行函数并设置超时限制"""
if kwargs is None:
kwargs = {}
result = []
error = []
def wrapper():
try:
result.append(func(*args, **kwargs))
except Exception as e:
error.append(e)
thread = threading.Thread(target=wrapper)
thread.daemon = True
thread.start()
thread.join(timeout)
if thread.is_alive():
print(f"警告: {func.__name__} 超时({timeout}秒),跳过此方法")
return None
if error:
return result[0]
def display_solutions():
"""显示所有找到的解"""
print(f"寻找 {TARGET} 的解(单个乘积范围: {MIN_PRODUCT}~{MAX_PRODUCT},超时时间: {SOLVER_TIMEOUT}秒)")
# 优先查找单变量解
print("\n尝试单变量解...")
single_solutions = run_with_timeout(find_single_variable_solutions)
if single_solutions:
print("\n找到单变量解:")
for a, x in single_solutions:
print(f"a={a}, x={x}, a*x={a*x}")
return
# 其次查找双变量解
print("\n尝试双变量解...")
two_solutions = run_with_timeout(find_two_variable_solutions)
if two_solutions:
print("\n找到双变量解:")
balanced = find_balanced_solutions(two_solutions, 2)
for a, x, b, y in balanced:
print(f"a={a}, x={x}, b={b}, y={y}, a*x={a*x}, b*y={b*y}, 总和={a*x + b*y}")
return
# 最后查找三变量解(仅当TARGET > 200000时)
if TARGET > 200000:
print("\n尝试三变量解...")
three_solutions = run_with_timeout(find_three_variable_solutions)
if three_solutions:
print("\n找到三变量解:")
balanced = find_balanced_solutions(three_solutions, 3)
for a, x, b, y, c, z in balanced:
print(f"a={a}, x={x}, b={b}, y={y}, c={c}, z={z}, "
f"a*x={a*x}, b*y={b*y}, c*z={c*z}, 总和={a*x + b*y + c*z}")
return
print("\n没有找到符合条件的解,或所有方法超时。")
if __name__ == "__main__":
display_solutions()
print(f"\n总耗时: {time.time() - start_time:.2f}秒")
ZnJvbSBpdGVydG9vbHMgaW1wb3J0IHByb2R1Y3QsIGNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50CmltcG9ydCB0aW1lCmltcG9ydCB0aHJlYWRpbmcKCiMg6YWN572u5Y+C5pWw77yI5Y+v5qC55o2u6ZyA6KaB5L+u5pS577yJClRBUkdFVCA9IDIyODc3NCAgIyDnm67moIflgLwKTUlOX1BST0RVQ1QgPSA3NDAwMCAgIyDljZXkuKrkuZjnp6/nmoTmnIDlsI/lgLwKTUFYX1BST0RVQ1QgPSAxMTUwMDAgICMg5Y2V5Liq5LmY56ev55qE5pyA5aSn5YC8ClZBTFVFUyA9IFszNSw0MC41LDU4LDY3LDczLDkwLjVdICAjIOezu+aVsOWIl+ihqApNQVhfVkFSUyA9IDMgICMg5pyA5aSa5L2/55So55qE5Y+Y6YeP5pWwClNPTFZFUl9USU1FT1VUID0gMzAgICMg5q+P5Liq5rGC6Kej5Zmo55qE6LaF5pe25pe26Ze077yI56eS77yJCgpkZWYgaXNfdmFsaWRfcHJvZHVjdChwKToKICAgICIiIuajgOafpeWNleS4quS5mOenr+aYr+WQpuWcqOacieaViOiMg+WbtOWGhSIiIgogICAgcmV0dXJuIE1JTl9QUk9EVUNUIDw9IHAgPD0gTUFYX1BST0RVQ1QKCmRlZiBmaW5kX3NpbmdsZV92YXJpYWJsZV9zb2x1dGlvbnMoKToKICAgICIiIuafpeaJvuWNleS4quaVsOeahOino++8iGEqeCA9IFRBUkdFVO+8iSIiIgogICAgc29sdXRpb25zID0gW10KICAgIGZvciBhIGluIFZBTFVFUzoKICAgICAgICB4ID0gVEFSR0VUIC8gYQogICAgICAgIGlmIHguaXNfaW50ZWdlcigpIGFuZCAxIDw9IHggPD0gMTAwMDAgYW5kIGlzX3ZhbGlkX3Byb2R1Y3QoYSAqIHgpOgogICAgICAgICAgICBzb2x1dGlvbnMuYXBwZW5kKChhLCB4KSkKICAgIHJldHVybiBzb2x1dGlvbnMKCmRlZiBmaW5kX3R3b192YXJpYWJsZV9zb2x1dGlvbnMoKToKICAgICIiIuafpeaJvuS4pOS4quaVsOeahOino++8iGEqeCArIGIqeSA9IFRBUkdFVO+8iSIiIgogICAgc29sdXRpb25zID0gW10KICAgIGZvciBhLCBiIGluIHByb2R1Y3QoVkFMVUVTLCByZXBlYXQ9Mik6CiAgICAgICAgaWYgYSA9PSBiOiAgIyDpgb/lhY3ph43lpI3nu4TlkIgKICAgICAgICAgICAgY29udGludWUKICAgICAgICBtYXhfeCA9IGludCgoVEFSR0VUIC0gTUlOX1BST0RVQ1QpIC8gYSkKICAgICAgICBmb3IgeCBpbiByYW5nZSgxLCBtYXhfeCArIDEpOgogICAgICAgICAgICBheCA9IGEgKiB4CiAgICAgICAgICAgIGlmIG5vdCBpc192YWxpZF9wcm9kdWN0KGF4KToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHJlbWFpbmRlciA9IFRBUkdFVCAtIGF4CiAgICAgICAgICAgIGlmIHJlbWFpbmRlciA8IE1JTl9QUk9EVUNUOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgeSA9IHJlbWFpbmRlciAvIGIKICAgICAgICAgICAgaWYgeS5pc19pbnRlZ2VyKCkgYW5kIDEgPD0geSA8PSAxMDAwMCBhbmQgaXNfdmFsaWRfcHJvZHVjdChiICogeSk6CiAgICAgICAgICAgICAgICBzb2x1dGlvbnMuYXBwZW5kKChhLCB4LCBiLCB5KSkKICAgIHJldHVybiBzb2x1dGlvbnMKCmRlZiBmaW5kX3RocmVlX3ZhcmlhYmxlX3NvbHV0aW9ucygpOgogICAgIiIi5p+l5om+5LiJ5Liq5pWw55qE6Kej77yIYSp4ICsgYip5ICsgYyp6ID0gVEFSR0VU77yJIiIiCiAgICBzb2x1dGlvbnMgPSBbXQogICAgZm9yIGEsIGIsIGMgaW4gY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQoVkFMVUVTLCAzKToKICAgICAgICAjIOehruS/neS4ieS4quaVsOS4jeWFqOebuOWQjO+8jOWHj+WwkemHjeWkjeiuoeeulwogICAgICAgIGlmIGxlbih7YSwgYiwgY30pID09IDE6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIAogICAgICAgIG1heF94ID0gaW50KChUQVJHRVQgLSAyICogTUlOX1BST0RVQ1QpIC8gYSkKICAgICAgICBmb3IgeCBpbiByYW5nZSgxLCBtYXhfeCArIDEpOgogICAgICAgICAgICBheCA9IGEgKiB4CiAgICAgICAgICAgIGlmIG5vdCBpc192YWxpZF9wcm9kdWN0KGF4KToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHJlbWFpbmRlcjEgPSBUQVJHRVQgLSBheAogICAgICAgICAgICBpZiByZW1haW5kZXIxIDwgMiAqIE1JTl9QUk9EVUNUOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIAogICAgICAgICAgICBtYXhfeSA9IGludCgocmVtYWluZGVyMSAtIE1JTl9QUk9EVUNUKSAvIGIpCiAgICAgICAgICAgIGZvciB5IGluIHJhbmdlKDEsIG1heF95ICsgMSk6CiAgICAgICAgICAgICAgICBieSA9IGIgKiB5CiAgICAgICAgICAgICAgICBpZiBub3QgaXNfdmFsaWRfcHJvZHVjdChieSk6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHJlbWFpbmRlcjIgPSByZW1haW5kZXIxIC0gYnkKICAgICAgICAgICAgICAgIGlmIHJlbWFpbmRlcjIgPCBNSU5fUFJPRFVDVDoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgeiA9IHJlbWFpbmRlcjIgLyBjCiAgICAgICAgICAgICAgICBpZiB6LmlzX2ludGVnZXIoKSBhbmQgMSA8PSB6IDw9IDEwMDAwIGFuZCBpc192YWxpZF9wcm9kdWN0KGMgKiB6KToKICAgICAgICAgICAgICAgICAgICBzb2x1dGlvbnMuYXBwZW5kKChhLCB4LCBiLCB5LCBjLCB6KSkKICAgIHJldHVybiBzb2x1dGlvbnMKCmRlZiBmaW5kX2JhbGFuY2VkX3NvbHV0aW9ucyhzb2x1dGlvbnMsIHZhcl9jb3VudCk6CiAgICAiIiLku47miYDmnInop6PkuK3nrZvpgInlh7rmnIDlubPooaHnmoTop6MiIiIKICAgIGlmIHZhcl9jb3VudCA9PSAxOgogICAgICAgIHJldHVybiBzb2x1dGlvbnMgICMg5Y2V5Y+Y6YeP5peg6ZyA5bmz6KGh562b6YCJCiAgICAKICAgICMg6K6h566X6Kej55qE5bmz6KGh5oCn77yI5Y+Y6YeP6Ze05beu5byC5pyA5bCP77yJCiAgICBiYWxhbmNlZCA9IFtdCiAgICBmb3Igc29sIGluIHNvbHV0aW9uczoKICAgICAgICB2YXJzID0gc29sWzE6OjJdICAjIOaPkOWPlngsIHksIHoKICAgICAgICBkaWZmID0gbWF4KHZhcnMpIC0gbWluKHZhcnMpCiAgICAgICAgYmFsYW5jZWQuYXBwZW5kKChkaWZmLCBzb2wpKQogICAgCiAgICAjIOaMieW3ruW8guaOkuW6j++8jOWPluWJjTXkuKoKICAgIHJldHVybiBbcyBmb3IgXywgcyBpbiBzb3J0ZWQoYmFsYW5jZWQsIGtleT1sYW1iZGEgeDogeFswXSlbOjVdXQoKZGVmIHJ1bl93aXRoX3RpbWVvdXQoZnVuYywgYXJncz0oKSwga3dhcmdzPU5vbmUsIHRpbWVvdXQ9U09MVkVSX1RJTUVPVVQpOgogICAgIiIi6L+Q6KGM5Ye95pWw5bm26K6+572u6LaF5pe26ZmQ5Yi2IiIiCiAgICBpZiBrd2FyZ3MgaXMgTm9uZToKICAgICAgICBrd2FyZ3MgPSB7fQogICAgCiAgICByZXN1bHQgPSBbXQogICAgZXJyb3IgPSBbXQogICAgCiAgICBkZWYgd3JhcHBlcigpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChmdW5jKCphcmdzLCAqKmt3YXJncykpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBlcnJvci5hcHBlbmQoZSkKICAgIAogICAgdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9d3JhcHBlcikKICAgIHRocmVhZC5kYWVtb24gPSBUcnVlCiAgICB0aHJlYWQuc3RhcnQoKQogICAgdGhyZWFkLmpvaW4odGltZW91dCkKICAgIAogICAgaWYgdGhyZWFkLmlzX2FsaXZlKCk6CiAgICAgICAgcHJpbnQoZiLorablkYo6IHtmdW5jLl9fbmFtZV9ffSDotoXml7bvvIh7dGltZW91dH3np5LvvInvvIzot7Pov4fmraTmlrnms5UiKQogICAgICAgIHJldHVybiBOb25lCiAgICAKICAgIGlmIGVycm9yOgogICAgICAgIHJhaXNlIGVycm9yWzBdCiAgICAKICAgIHJldHVybiByZXN1bHRbMF0KCmRlZiBkaXNwbGF5X3NvbHV0aW9ucygpOgogICAgIiIi5pi+56S65omA5pyJ5om+5Yiw55qE6KejIiIiCiAgICBwcmludChmIuWvu+aJviB7VEFSR0VUfSDnmoTop6PvvIjljZXkuKrkuZjnp6/ojIPlm7Q6IHtNSU5fUFJPRFVDVH1+e01BWF9QUk9EVUNUfe+8jOi2heaXtuaXtumXtDoge1NPTFZFUl9USU1FT1VUfeenku+8iSIpCiAgICAKICAgICMg5LyY5YWI5p+l5om+5Y2V5Y+Y6YeP6KejCiAgICBwcmludCgiXG7lsJ3or5XljZXlj5jph4/op6MuLi4iKQogICAgc2luZ2xlX3NvbHV0aW9ucyA9IHJ1bl93aXRoX3RpbWVvdXQoZmluZF9zaW5nbGVfdmFyaWFibGVfc29sdXRpb25zKQogICAgaWYgc2luZ2xlX3NvbHV0aW9uczoKICAgICAgICBwcmludCgiXG7mib7liLDljZXlj5jph4/op6PvvJoiKQogICAgICAgIGZvciBhLCB4IGluIHNpbmdsZV9zb2x1dGlvbnM6CiAgICAgICAgICAgIHByaW50KGYiYT17YX0sIHg9e3h9LCBhKng9e2EqeH0iKQogICAgICAgIHJldHVybgogICAgCiAgICAjIOWFtuasoeafpeaJvuWPjOWPmOmHj+inowogICAgcHJpbnQoIlxu5bCd6K+V5Y+M5Y+Y6YeP6KejLi4uIikKICAgIHR3b19zb2x1dGlvbnMgPSBydW5fd2l0aF90aW1lb3V0KGZpbmRfdHdvX3ZhcmlhYmxlX3NvbHV0aW9ucykKICAgIGlmIHR3b19zb2x1dGlvbnM6CiAgICAgICAgcHJpbnQoIlxu5om+5Yiw5Y+M5Y+Y6YeP6Kej77yaIikKICAgICAgICBiYWxhbmNlZCA9IGZpbmRfYmFsYW5jZWRfc29sdXRpb25zKHR3b19zb2x1dGlvbnMsIDIpCiAgICAgICAgZm9yIGEsIHgsIGIsIHkgaW4gYmFsYW5jZWQ6CiAgICAgICAgICAgIHByaW50KGYiYT17YX0sIHg9e3h9LCBiPXtifSwgeT17eX0sIGEqeD17YSp4fSwgYip5PXtiKnl9LCDmgLvlkow9e2EqeCArIGIqeX0iKQogICAgICAgIHJldHVybgogICAgCiAgICAjIOacgOWQjuafpeaJvuS4ieWPmOmHj+ino++8iOS7heW9k1RBUkdFVCA+IDIwMDAwMOaXtu+8iQogICAgaWYgVEFSR0VUID4gMjAwMDAwOgogICAgICAgIHByaW50KCJcbuWwneivleS4ieWPmOmHj+inoy4uLiIpCiAgICAgICAgdGhyZWVfc29sdXRpb25zID0gcnVuX3dpdGhfdGltZW91dChmaW5kX3RocmVlX3ZhcmlhYmxlX3NvbHV0aW9ucykKICAgICAgICBpZiB0aHJlZV9zb2x1dGlvbnM6CiAgICAgICAgICAgIHByaW50KCJcbuaJvuWIsOS4ieWPmOmHj+ino++8miIpCiAgICAgICAgICAgIGJhbGFuY2VkID0gZmluZF9iYWxhbmNlZF9zb2x1dGlvbnModGhyZWVfc29sdXRpb25zLCAzKQogICAgICAgICAgICBmb3IgYSwgeCwgYiwgeSwgYywgeiBpbiBiYWxhbmNlZDoKICAgICAgICAgICAgICAgIHByaW50KGYiYT17YX0sIHg9e3h9LCBiPXtifSwgeT17eX0sIGM9e2N9LCB6PXt6fSwgIgogICAgICAgICAgICAgICAgICAgICAgZiJhKng9e2EqeH0sIGIqeT17Yip5fSwgYyp6PXtjKnp9LCDmgLvlkow9e2EqeCArIGIqeSArIGMqen0iKQogICAgICAgICAgICByZXR1cm4KICAgIAogICAgcHJpbnQoIlxu5rKh5pyJ5om+5Yiw56ym5ZCI5p2h5Lu255qE6Kej77yM5oiW5omA5pyJ5pa55rOV6LaF5pe244CCIikKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBzdGFydF90aW1lID0gdGltZS50aW1lKCkKICAgIGRpc3BsYXlfc29sdXRpb25zKCkKICAgIHByaW50KGYiXG7mgLvogJfml7Y6IHt0aW1lLnRpbWUoKSAtIHN0YXJ0X3RpbWU6LjJmfeenkiIp