思路:非常经典的打表找规律题目,其背后的本质是:1.裴蜀定理:对于整数a和b,方程ax + by = n有整数解,当且仅当 gcd(a,b)∣n,也就是gcd能够去整除n。2.弗罗贝尼乌斯硬币结论:对于互质的正整数a和b,最大的不能表示为ax + by(x,y ≥ 0)的数是:ab − a − b。
因此,我们打个表可以发现如下规律:1.索引0~16,也就是前17个数没有规律性,直接收集到ans数组中回答即可;2.从索引17开始,每8个为一组,形成了的规律,那我们就在奇数的时候输出-1,偶数的时候就先用当前数n - 前17个舍去的数,再// 8 + 起始值3,就能得到
表示的答案了
代码:
import sys
input = lambda: sys.stdin.readline().strip()
import math
inf = 10 ** 18
def I():
return input()
def II():
return int(input())
def MII():
return map(int, input().split())
def LI():
return input().split()
def LII():
return list(map(int, input().split()))
def LFI():
return list(map(float, input().split()))
fmax = lambda x, y: x if x > y else y
fmin = lambda x, y: x if x < y else y
isqrt = lambda x: int(math.sqrt(x))
'''
'''
def solve():
n = II()
# 打表
# for i in range(n):
# ans = inf
# def dfs(i, cnt):
# nonlocal ans
# if i < 0:
# return
# if i == 0:
# ans = fmin(ans, cnt)
# return
# dfs(i - 6, cnt + 1)
# dfs(i - 8, cnt + 1)
# dfs(i, 0)
# print(i, ans if ans < inf else -1)
ans = [0, -1, -1, -1, -1, -1, 1, -1, 1, -1, -1, -1, 2, -1, 2, -1, 2]
if n <= 16:
print(ans[n])
else:
if n & 1:
print(-1)
else:
print((n - 17) // 8 + 3)
t = 1
# t = II()
for _ in range(t):
solve()

京公网安备 11010502036488号