蓝桥杯2025国赛-免费披萨
蓝桥杯2025国赛-免费披萨
方法一:
手动枚举所有的1-9全排列,枚举插入位置,枚举插入数字
import os
import sys
# 请在此输入您的代码
ans = []
from math import gcd
n = int(input())
def dfs(num_set: set, path: list):
if len(path) == 8:
ans.append(int(''.join(map(str, path.copy()))))
for i in range(1, 9):
if i not in num_set:
num_set.add(i)
path.append(i)
dfs(num_set, path)
num_set.remove(i)
path.pop()
for i in range(1, 9):
dfs({i}, [i])
res = 0
best_num = 0
for x in ans:
num_list = list(str(x))
# 枚举插入位置
for i in range(9):
# 枚举数字
for j in range(1, 9):
cur = num_list.copy()
cur.insert(i, str(j))
cur_num = int(''.join(cur))
g = gcd(n, cur_num)
if g > res:
res = g
best_num = cur_num
elif g == res:
if cur_num < best_num:
best_num = cur_num
print(best_num)方法二:
使用库函数进行优化
import os
import sys
from math import gcd
from itertools import permutations
# 请在此输入您的代码
n = int(input())
res = 0
best_num = 0
# 直接用 permutations 生成所有排列
for perm in permutations(range(1, 9)):
# 将排列转为字符串,避免反复 list(str(x))
base = ''.join(map(str, perm))
# 枚举插入位置和插入数字
for pos in range(9):
for d in range(1, 9):
# 直接构造字符串,不用列表操作
cur = base[:pos] + str(d) + base[pos:]
cur_num = int(cur)
g = gcd(n, cur_num)
if g > res:
res = g
best_num = cur_num
elif g == res and cur_num < best_num:
best_num = cur_num
print(best_num)代码一(原始DFS)
时间复杂度O(5×10⁷)
空间复杂度O(4×10⁴)
代码二(优化版)
时间复杂度O(5×10⁷)
空间复杂度O(1)
蓝桥杯2025国赛-免费披萨
https://lincodex.cn/index.php/archives/20/