原始为求这么一个式子:
的数值增长是非常快的,在
的范围下,其个数非常有限,那么我们不妨预处理出阶乘表,阶乘到刚好大于
的位数就可以了。
由于的个数非常有限,我们可以直接枚举
,然后一个二维问题就变为了:
。
求最小,其实也就是绝对值在0附近,那么不妨直接假设,那么式子变为:
。
由于可能有偏移,可以试一下和
是否满足满足要求。
import sys
from math import inf
if __name__ == '__main__':
n = int(input())
fac = [1]
for i in range(1,31):
if fac[-1] * i > 10 ** 9:
fac.append(fac[-1] * i)
break
fac.append(fac[-1] * i)
#退化为f(y)的函数
mn = abs(n)
res_x = 1
res_y = 1
def cal(y: int) -> None:
if y <= 0 or y == 2:
return
global mn
global res_y
global res_x
if abs((fac[x] - 1) * y - n) < mn:
mn = abs((fac[x] - 1) * y - n)
res_x = x
res_y = y
for x in range(3,len(fac)):
if x == 2:
continue
y = n // (fac[x] - 1)
cal(y)
cal(y - 1)
cal(y + 1)
print(res_x, res_y)