9.28 排列最小值
Posted venividivici
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了9.28 排列最小值相关的知识,希望对你有一定的参考价值。
题意
对于一个长度为(n)的排列(a),我们设变量(tmp)初始为(n+1),从(1)到(n)枚举,如果(tmp>a_i),则令(tmp=a_i)
定义一个排列的价值为(tmp)改变的次数的平方
求长为(n)的所有排列的价值之和,取模(998244353)
解法
这题被全场爆切。。然而我没想出来
考虑递推的解法:
设(g[i])为长度为(i)的排列中(tmp)改变次数之和
设(f[i])为长度为(i)的排列中(tmp)改变次数的平方和
考虑从长度为(1)的排列开始逐个向里面添加元素,(f)数组与(g)数组的改变量
首先更新(g)数组
我们可以发现,由于当前添加的元素是整个排列中最大的,所以它一定要放在开头才有贡献,如果放在原来的排列之中,由于(tmp)的第一次改变一定在第一个元素处,而当前元素又一定比第一个元素大,所以(tmp)永远不会再当前元素的位置发生改变
因此,若当前元素插入原排列内部,答案是不会改变的。而元素的插入位置不同,得到的新排列也不同,所以(g[i])首先累加上(g[i-1] imes (i-1))
若当前元素放在开头的位置,则原来所有的排列的答案在其基础上会加一。一共有((i-1)!)个排列,所以答案要增加((i-1)!)。因此
[
g[i]=g[i-1] imes(i-1)+g[i-1]+(i-1)!=g[i-1] imes i+(i-1)!
]
有了(g)数组以后,相应的(f)就比较好推了(把平方式拆开)
[
f[i]=2 imes g[i-1]+i imes f[i-1]+(i-1)!
]
代码
代码没什么好贴的
以上是关于9.28 排列最小值的主要内容,如果未能解决你的问题,请参考以下文章
编写程序'任何三个整数,按照从大到小的排列顺序输出或输出最大最小值