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 排列最小值的主要内容,如果未能解决你的问题,请参考以下文章

编写程序'任何三个整数,按照从大到小的排列顺序输出或输出最大最小值

SPOJ - AMR11H Array Diversity (水题排列组合或容斥)

SQL查询某字段最小值对应的行

元组对,使用 python 找到最小值

leetcode中等2165重排数字的最小值

excel里说的“第K个最大值”和“第K个最小值”指啥,啥意思,怎么计算。