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))
3
9
样例:
2022
593300958