5.11
一个骰子六个面,一开始随机一个面在底下,每次将骰子向一个方向滚动一格,把在底面的数字写下来,重复 \(n\) 次得到长度为 \(n\) 的序列。
要求序列中 \(1\) 到 \(6\) 的出现次数都在 \([l,r]\) 中,求不同序列个数。
sol:
暴力要 \(n^6\) 很难优化,关键性质在于对面两个数字看成一组的话共有三组,每一次都能从一组走到另外一组,而组内方案数可以预处理,此时优化到 \(n^3\)。
若不考虑 dp 则枚举三组分别有多少个,发现要求解决 \(a\) 个 \(1\),\(b\) 个 \(2\),\(c\) 个 \(3\) 相邻数不同的序列个数。
考虑容斥,枚举三种数分别有多少个位置满足相同,此时就可以知道有多少个 \(1,2,3\) 段开头,系数是一个多重组合数用来排列段开头,排列完后考虑段内排列是插板。
写成 gf 形式之后此时对于确定的 \(a,b\) 单组是 \(n \log n\),考虑外层枚举实际上是多项式乘法,其中每一项系数仍是多项式,二维 NTT 即可做到 \(n^2 \log n\)。可能可以整式递推做到 \(n^2\)。