码迷,mamicode.com
首页 > 其他好文 > 详细

9.28 排列最小值

时间:2019-09-28 16:15:02      阅读:72      评论:0      收藏:0      [点我收藏+]

标签:次数   才有   答案   添加元素   time   splay   枚举   span   原来   

题意

对于一个长度为\(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]\times (i-1)\)

若当前元素放在开头的位置,则原来所有的排列的答案在其基础上会加一。一共有\((i-1)!\)个排列,所以答案要增加\((i-1)!\)。因此
\[ g[i]=g[i-1]\times(i-1)+g[i-1]+(i-1)!=g[i-1]\times i+(i-1)! \]
有了\(g\)数组以后,相应的\(f\)就比较好推了(把平方式拆开)
\[ f[i]=2\times g[i-1]+i\times f[i-1]+(i-1)! \]

代码

代码没什么好贴的

9.28 排列最小值

标签:次数   才有   答案   添加元素   time   splay   枚举   span   原来   

原文地址:https://www.cnblogs.com/VeniVidiVici/p/11603473.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!