解题报告 P12405 「CZOI-R3」星光闪耀
解题报告 P12405 「CZOI-R3」星光闪耀
大困难题!
题目描述
形式化题意
给定一个可重集 \(S_0\),初始 \(S_0\) 中只有一个数 \(n\)。
定义一次操作为:新建一个可重集 \(S_1\),对于 \(\forall1\le i\le|S_0|\),若 \(S_{0,i}\ge 2\),则对于 \(\forall1\le j\le S_{0,i}-1\),将 \(j\) 加入 \(S_1\)。在这次操作的最后,将 \(S_1\) 中所有元素加入 \(S_0\)。
求进行了 \(m\) 次操作后的 \(\sum_{i=1}^{|S_0|} k^{S_{0,i}}\),对 \(998244353\) 取模。
输入格式
本题有多组测试数据。
第一行输入 \(1\) 个整数 \(T\)。
接下来 \(T\) 行,每行输入 \(3\) 个整数 \(n,m,k\)。
输出格式
共 \(T\) 行,每行输出 \(1\) 个整数,表示该组数据的答案。
输入输出样例 #1
输入 #1
5
3 4 6
8 2 5
501 501 6
11451 41919 313172124
824431 960532 10000007
输出 #1
420
610340
520860091
95420244
42443525
说明/提示
【数据范围】
本题采用捆绑测试。
记 \(\sum n,\sum m\) 分别为单个测试点内 \(n,m\) 的和。
对于 \(100\%\) 的数据,\(1\le T\le5\times10^5\),\(1\le n\le2\times10^6\),\(1\le m\le2\times10^6\),\(\sum m\le2\times10^7\),\(0\le k\le998244352\)。
一眼看我们发现这个玩意儿是不是很不可做?
这个题意是不是很看不懂?
没事,我们手膜一下就好了。
假设现在给定初始值是 \(4\)。
第一次操作后,序列将变成:\(4、3、2、1\) --> \(4 \times 1、3 \times 1、2 \times 1、1 \times 1\)。
第二次操作后,序列将变成:\(4、3、3、2、2、2、1、1、1、1\) --> \(4 \times 1、3 \times 2、2 \times 3、1 \times 4\)。
第三次操作后,序列将变成:\(4、3、3、3、2、2、2、2、2、2、1、1、1、1、1、1、1、1、1、1\) --> \(4 \times 1、3 \times 3、2 \times 6、1 \times 10\)。
第四次操作后,序列将变成:\(4、3、3、3、3、2、2、2、2、2、2、2、2、2、2、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1\) --> \(4 \times 1、3 \times 4、2 \times 10、1 \times 20\)。
我们发现,第 \(n - i\) 个数出现的个数为它操作前比它大的数 + 之前它出现的个数。
设 \(cnt_{i,j}\) 为值为 \(i\) ,进行第 \(j\) 次操作的出现次数。
然后,就有 \(cnt_{i,j}\) = \(cnt_{i,j - 1} + \sum_{k = i + 1}^{n} cnt_{k,j - 1}\)。
然后我们发现:欸!这不是杨辉三角嘛!
发现每一次操作的实际上是在杨辉三角上向下走一位。
初始就是杨辉三角的每一列的最后一个值(为 \(1\))。
所以实际上 \(cnt_{i,j} = \binom{m + 1 + n - i}{n - i}\)。
那我们的答案就是 \(\sum_{i = 1}^{n}{\binom{m + 1 + n - i}{n - i} K^i}\)。
也就是 \(\sum_{i = 0}^{n - 1}\binom{m + 1 + i}{i} K^{n - i}\)。(这个柿子更好看qwq)
这个东西我们很好求,但是我们发现时间复杂度是 \(O(\sum n)\) 的,也就是 \(O(Tn)\)。
你会获得 10 pts的好成绩,加上特判能有 35 pts!
上边都是小儿科,只要现在还留在机房的基本都能一眼出。
下边的才是重头戏!
考虑优化这个柿子。
我们发现这个玩意儿很像一个等比数列求和。
但是有系数!(翻遍 Bing 也没找出怎么做带系数等比数列求和)
总之先上等比数列求和公式再说。
设 \(S\) 等于上边这一坨。
然后就有
然后我们通过 OI-wiki 组合数性质,发现 \((\binom{m + i + 2}{i + 1} - \binom{m + i + 1}{i})\) 等于 \(\binom{m + i - 1}{i + 1}\)。
那么原式就成了 \(\frac{K^{n + 1} + \sum_{i = 0}^{n - 2}\binom{m + i - 1}{i + 1}K^{n - i} - \binom{m + n}{n - 1}K}{K - 1}\)。
我们发现,这样的话,枚举范围就变小了欸。
从 \([0,n - 1]\) 变成了 \([0,n - 2]\)。
我们不妨设 \(dp_i\) 代表进行 \(i\) 次操作后的值。
重复上边的过程。有
也就是
然后发现这个东西可以递推(也就是把上边我们的化简(枚举区间减少)过程重复到 0)。
最后答案就是 \(dp_m\)。
这样时间复杂度 \(O(\sum m)\)。
然后你就获得 70 pts的好成绩www。
然后你发现你的预处理要处理 500 ms!
然后你要把你的 \(O(n\log{n})\) 预处理改成 \(O(n)\) 的。
然后你就可以 AC 这道题啦 ~\ (≧▽≦) /~
完结撒花 ~\ (≧▽≦) /~ 。

浙公网安备 33010602011771号