标签:次数 才有 答案 添加元素 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)!
\]
代码没什么好贴的
标签:次数 才有 答案 添加元素 time splay 枚举 span 原来
原文地址:https://www.cnblogs.com/VeniVidiVici/p/11603473.html