打卡记录
包子凑数(裴蜀定理 + 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 sysn, 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]] = 1for 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 += 1print(cnt)