把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

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\) 个,那么答案就是:

\[\sum_{i=1}^n a_i\times cnt_i \]

现在问题转化为怎么求 \(cnt_i\),我们知道:

\[cnt_i=\sum_{x_1x_2\dots x_m=i}c_{x_1}c_{x_2}\dots c_{x_m} \]

考虑 \(m\leq 2\) 的情况。

那么我们的求法就是:

\[cnt_i=\sum_{x_1x_2=i}c_{x_1}c_{x_2} \]

本质上就是:

\[cnt_i=\sum_{d\mid i}c_dc_{\frac{i}d} \]

\(c\) 看作是一个函数,也就是说 \(c(x)=c_x\)

那么就是:

\[cnt_i=\sum_{d\mid i}c(d)c(\frac{i}{d}) \]

这是一个狄利克雷卷积形式,即使你不知道也没有什么关系。

显然 \(m\leq 2\) 时你直接暴力枚举 \(d\) 即可,这个可以达到 \(\mathcal{O}(n\log n)\),但是也给 \(\mathcal{O}(n\sqrt n)\) 过。

现在考虑 \(m>2\) 的情况。

设:

\[(f*g)(n)=\sum_{d\mid n}f(d)g(\frac n d) \]

这是一个经典的狄利克雷卷积形式。

那么我们上述的过程可以被看作 \((c*c)(n)\)

那么考虑 \(m=3\) 呢?

那么就可以变成:

\[\begin{align} &&&\sum_{x_1x_2x_3=i}c(x_1)c(x_2)c(x_3)\\ &&=&\sum_{x_3\mid i}\left(\sum_{x_2\mid \frac{i}{ x_3}}c(\frac{i}{x_2x_3})c(x_2)\right)c(\frac i {x_3}) \end{align} \]

\((2)\) 中的括号部分,我们类似地设为 \(F(x)\)

那么就是:

\[\sum_{x_1x_2x_3=i}F(\frac i {x_3})c(x_3) \]

也就是说 \(F(x)\) 表示 \(x_1x_2\) 乘积为 \(x\) 的卷积。

显然的 \(F(x)=(c*c)(n)\)

那么就变成了:

\[cnt_i=\sum_{x_3\mid i}F(\frac{i}{x_3})c(x_3) \]

\(x_3\) 换成 \(d\) 那就是我们狄利克雷的经典式子,所以说当 \(m=3\) 时,卷积过来的函数为:

\[(c*(c*c)(n))(n) \]

显然可以直接用数学归纳法推广到任意情况:即对于任何 \(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)\)

posted @ 2025-11-11 20:03  high_skyy  阅读(21)  评论(0)    收藏  举报
浏览器标题切换
浏览器标题切换end