打卡记录
包子凑数(裴蜀定理 + DP)
根据裴蜀定理,存在 c = gcd(a, b) 使不定方程ax + by = c满足条件,如果gcd(a, b) == 1即a与b互素的情况下,就会 ax + by = 1,由于为1可以构造后面的无穷数字,故得到结论当 gcd(a, b) == 1 时,才存在有限无法构造的数字情况。根据定理a, b最大无法构造的数字为 (a - 1)(b - 1) - 1,而后再采用 0-1 背包的算法思想解决。
import math
import sys
n, m = int(input()), 10000
nums = [int(input()) for _ in range(n)]
g = nums[0]
for num in nums:
g = math.gcd(g, num)
if g != 1:
print("INF")
sys.exit(0)
f = [0 for _ in range(m)]
for i in range(n):
f[nums[i]] = 1
for j in range(nums[i] + 1, m):
f[j] |= f[j - nums[i]]
cnt = 0
for i in range(1, m):
if f[i] == 0:
cnt += 1
print(cnt)