CF1750G

前面到 \(O(n^3)\) 不再赘述,主要就是先把划分段变成上升位置再去反演会好做一些。

最后从 \(O(n^3)\) 到 \(O(n^2)\) 是找到一种方法可以只在最后做一次二项式反演,原本是左侧为恰好选了多少个右侧为钦定选了多少个,那就需要每次把右边钦定反演成恰好再贡献答案。实际上可以把左侧的恰好变为钦定。设 \(f\) 为恰好,\(g\) 为钦定,这里先对于集合考虑,我们如果想要满足反演形式,只做一次就必须时刻满足 \(g_S= \sum_{ S \subseteq T} f_T\)。由于前面的恰好只有一个位有值,我们可以把前面的恰好变为钦定,即给其子集位置全部赋值为 \(1\),这样就变为钦定了,注意到 \(popc\) 相同的集合等价,那就可以变为钦定 \(x\) 个位置了。设前 \(i\) 个有恰好 \(c_i\) 个位置上升。用生成函数写就是 \(F=(1+x)^{c_i}\)。那对于第 \(i\) 个位置对于最终钦定的贡献就是 \(F_i \times G_i\),实际上就是这两个的卷积。

我们可以把 \(c_i\) 相同的 \(G\) 的系数求和,记作 \(H_c\),最后要求的就是 \(\sum_{c=0}^{n-1} (1+x)^c \times H_c\),这个你可以把它拆成 \(((H_{n-1} \times (x+1) +H_{n-2}) \times (x+1) +H_{n-3})...\) 这样的形式,每个括号一个乘单项式一个加法,都是 \(O(n)\) 的,\(n\) 个括号就是 \(O(n^2)\),最终得到的系数就是钦定 \(x\) 个的方案,二项式反演即可。

这题主要还是把左侧恰好变为钦定再和右边卷积比较巧妙,这样做不会影响正确性是因为他时刻都满足二项式反演需要的形式 \(g_S= \sum_{ S \subseteq T} f_T\),之前都没见过这种东西,感觉比较高手。

posted @ 2026-10-09 23:01  lmy333  阅读(8)  评论(0)    收藏  举报