蓝桥杯2025国赛-免费披萨
蓝桥杯2025国赛-免费披萨
方法一:
枚举 1~8 的全排列,再枚举 9 个插入位置,插入一个 1~8 的数字。
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)计算量与存储
两种写法都检查 8! × 9 × 8 = 2,903,040 个候选(其中可能重复),每次还需构造九位数并计算 GCD。这个数是本题固定规模下的候选次数,不应写成时间复杂度的大 O。
原始 DFS 会保存 8! = 40,320 个基础排列对应的整数;库函数版本逐个生成排列,不保存全部结果,降低了额外存储。
蓝桥杯2025国赛-免费披萨
https://lincodex.cn/index.php/archives/20/