主要思路:
f(n)=f(n−1)×n+ n×(n−1)/2×g(n−1)
---其中f为全排列的价值,易知f(1) = 0,作为初始条件得到f(n) = f(2) = f(1)*2 + 2*1/2*g(1) = 1
---g(n-1):为(n-1)!,即n-1项的阶乘
---具体的思路推论,参考java大佬的思路:(395条消息) 第十三届蓝桥杯省赛Java A 组 F 题、Python A 组 G 题、Python B 组 G题——全排列的价值 (AC)_执 梗的博客-CSDN博客_蓝桥杯python和java
---以下是用python3.8,jupyter notebook实现的测试代码:
#全排列的价值 (AC)
#f(n)=f(n−1)×n+ n×(n−1)/2×g(n−1)
k = int(input())
g = []#记录阶乘
g.append(1)#g[0] = 1
mod=998244353
sum = 1
for i in range(1,k):
sum *= i
sum = sum % mod
g.append(sum)
def f(n):
if n == 1:
return 0
else:
return f(n-1)*n%mod + int(n*(n-1)/2)%mod * int(g[n-1])%mod
print(f(k))
输入1
3
输出1
9
样例:
输入2
2022
输出2
593300958