问题描述
对于一个排列 A=(a1,a2,⋯,an), 定义价值 ci 为 a1 至 ai−1 中小于 ai 的数 的个数, 即 ci=∣{aj∣j<i,aj<ai}∣。
定义 A 的价值为 ∑i=1nci 。
给定 n, 求 1 至 n 的全排列中所有排列的价值之和。
输入格式
输入一行包含一个整数 n 。
输出格式
输出一行包含一个整数表示答案, 由于所有排列的价值之和可能很大, 请 输出这个数除以 998244353 的余数。
样例输入 1
3
样例输出 1
9
样例输入 2
2022
样例输出 2
593300958
思路:这是一道动态规划问题,需要找到每一个排列之间的关系
2 的全排列(1,2)(2,1)
3的全排列(1,2,3)(1,3,2)(2,1,3)(2,3,1)(3,1,2)(3,2,1)
如果3在第一位,那么对价值c没有影响,还是2的价值
3在第二位,价值+1+1,也就是原来2的价值加上2全排列的总数
3在第三位,价值+2+2,原来2的价值加上2全排列的总数*2
所以我们能得到:
dp[i]=dp[i-1]*3+(0+1+...+i-1)*(n-1的全排列数)
mod = 998244353
n = int(input())
ans =2
dp = [0]*(n+3)
dp[1]=0
dp[2]=1
for i in range(3,n+1):
dp[i]=(dp[i-1]*i +ans*i*(i-1)//2)%mod
ans = (ans*i)%mod # 计算全排列数
print(dp[n]%mod)