全排列的价值(JAVA)
题目:
对于一个排列 A=(a1,a2,⋯,an), 定义价值ci 为a1 至ai−1 中小于ai 的数 的个数, 即ci=∣{aj∣j<i,aj<ai}∣。
定义 A 的价值为 c_{i}∑i=1nci 。
给定 n, 求 1 至 n 的全排列中所有排列的价值之和。
输入格式
输入一行包含一个整数 n 。
输出格式
输出一行包含一个整数表示答案, 由于所有排列的价值之和可能很大, 请 输出这个数除以 998244353 的余数。
样例输入 1
3
样例输出 1
9
样例输入 2
2022
样例输出 2
593300958
样例说明
1 至 3 构成的所有排列的价值如下:
(1,2,3):0+1+2=3
(1,3,2):0+1+1=2
(2,1,3):0+0+2=2
(2,3,1):0+1+0=1
(3,1,2):0+0+1=1
(3,2,1):0+0+0=0
故总和为 3+2+2+1+1=93+2+2+1+1=9 。
评测用例规模与约定
对于 40% 的评测用例, n≤20;
对于 70% 的评测用例, n≤5000;
对于所有评测用例, 2≤n≤106 。
运行限制
最大运行时间:1s
最大运行内存: 512M
代码:
import java.util.Scanner; |
思路:
该题采用动态规划的思想,所以关键就是找出状态转移方程也就是如何从dp[n-1]转移到dp[n]。
我们可以将其分为两部分计算:n插入前序列的价值+插入n产生的价值。
n插入前序列的价值:对于一个序列n一共有n种插入方式如3插入12有123,132,312先不看n该处价值为dp[n-1]*n。
插入n产生的价值:插入到末尾产生价值为n-1,插入第一个产生价值为0,每个位置对应(n-1)!个序列(也就是上述三种情况除了n不动剩下n-1个数全排列)则产生价值为(n-1)!*(0+1+2+…+n-1)
代码中用sum储存(0+1+2+…+n-1)
num储存了(n-1)!
然后列出状态转移方程: dp[i]=(dp[i-1](i)+numsum)%998244353;
本题是看其它博主的文章写出来的