U630653 异想天开 分析
面对这种题目,套路性地想到枚举 \(y\) 考虑 \(a_y\) 对答案贡献了多少。
令 \(c_x\) 表示 \(a\) 中 \(x\) 的出现次数。
设我们抽奖得到的依次为 \(x_1,x_2,\dots,x_m\),考虑有多少个有序数对 \((x_1,x_2,\dots,x_m)\) 满足 \(x_1x_2\dots x_m=y\)。
假设为 \(cnt_y\) 个,那么答案就是:
现在问题转化为怎么求 \(cnt_i\),我们知道:
考虑 \(m\leq 2\) 的情况。
那么我们的求法就是:
本质上就是:
将 \(c\) 看作是一个函数,也就是说 \(c(x)=c_x\)。
那么就是:
这是一个狄利克雷卷积形式,即使你不知道也没有什么关系。
显然 \(m\leq 2\) 时你直接暴力枚举 \(d\) 即可,这个可以达到 \(\mathcal{O}(n\log n)\),但是也给 \(\mathcal{O}(n\sqrt n)\) 过。
现在考虑 \(m>2\) 的情况。
设:
这是一个经典的狄利克雷卷积形式。
那么我们上述的过程可以被看作 \((c*c)(n)\)。
那么考虑 \(m=3\) 呢?
那么就可以变成:
看 \((2)\) 中的括号部分,我们类似地设为 \(F(x)\)。
那么就是:
也就是说 \(F(x)\) 表示 \(x_1x_2\) 乘积为 \(x\) 的卷积。
显然的 \(F(x)=(c*c)(n)\)。
那么就变成了:
将 \(x_3\) 换成 \(d\) 那就是我们狄利克雷的经典式子,所以说当 \(m=3\) 时,卷积过来的函数为:
显然可以直接用数学归纳法推广到任意情况:即对于任何 \(m(m>1)\) 答案的函数为 \(c^{*m}\),这个表示 \((c*c*\dots*c)(n)\)
显然狄利克雷卷积具有结合律和交换律,直接快速幂即可,时间复杂度 \(\mathcal{O}(n\log n\log m)\)。
应该可以更快地达到 \(\mathcal{O}(n\log m \log \log n)\)。

浙公网安备 33010602011771号