ABC285H

ABC285H

image

\(n, k \le 10000\)

一个元素是完全平方数当且仅当其质因数分解后,每个质数的幂次都是偶数。

题目要求每个元素都不是完全平方,这不太好描述,不妨容斥一下,设有 \(m\) 个数是完全平方。

用生成函数刻画这个问题(要求每个数 \(p_i\) 的幂次之和为 \(E_i\)),每个 \(p_i\) 对应的生成函数都是一样的,只不过要的是 \([x^{E_i}]\)

  • 如果一个数是完全平方,幂次一定是偶数,对于每个 \(p_i\) 的生成函数为 \(1 + x^2 + x^4 + \dots = \frac{1}{1 - x^2}\)
  • 否则,幂次就随便了,生成函数为 \(1 + x + x^2 + \dots = \frac{1}{1 - x}\)

那么贡献就是:

\[(-1)^m\binom{n}{m}\prod\limits_{i = 1}^k [x^{E_i}] \frac{1}{(1 - x^2)^m}\frac{1}{(1 - x) ^ {n - m}} = (-1)^m\binom{n}{m}\prod\limits_{i = 1}^k [x^{E_i}] \frac{1}{(1 + x)^m}\frac{1}{(1 - x) ^ n} \]

因为我们枚举了 \(m\),还要枚举 \(i\),所以需要 \(O(1)\) 求出 \([x^{E_i}]\),所以维护就只能维护整个生成函数了。

\(f_m(x) = \frac{1}{(1 + x)^m}\frac{1}{(1 - x) ^ n}\),那么可以直接得到 \(f_0(x)\)。但是如何快速计算 \(f_m(x)\)

我们可以从小到大枚举 \(m\)\(f_m(x) = \frac{1}{1 + x} f_{m - 1}(x)\),我们知道 \(\frac{1}{1 - x} = 1 + x + x^2 + \dots\),那么

\[\frac{1}{1 + x} = 1 - x + (-x)^2 + \dots = 1 - x + x^2 - x^3 + \dots + (-1)^ix^i + \dots \]

直接多项式乘法显然不太靠谱,从生成函数的乘法的定义来看待这个问题。

还是与 \(\frac{1}{1 - x}\) 做类比,它是做前缀和。而猜也能猜到, \(\frac{1}{1 + x}\) 其实是在做“前缀差”,注意不是差分。(差分要倒过来)

for (int x = 1; x <= w; x++) { 
  poly[x] -= poly[x - 1];
}

\(f_{m - 1}(x)\) 对应序列 \(F\)\(f_m(x) = f_{m - 1}(x)\frac{1}{1 - x}\) 对应序列 \(G\),那么有

\[\begin{aligned} G_i &= \sum\limits_{j = 0}^i (-1)^jF_{i - j} \\ &= F_i + \sum\limits_{j = 1}^i (-1)^j F_{i - j} \\ &= F_i - \sum\limits_{j = 0}^{i - 1}(-1)^jF_{i - (j + 1)} \\ &= F_i - G_{i - 1} \end{aligned} \]

就有了前面那段代码。也就可以在 \(O(\max E)\) 的时间算出 \(G\),也就是 \(f_m(x)\)。然后枚举 \(E_i\)\(O(1)\) 查询即可。

时间复杂度:\(O(nE)\)

这个题,首先要通过容斥搞成一个生成函数能解决的问题,写出多项式后需要计算 \(f_m(x)\) ,主要给的是 \(\frac{1}{1 + x}\),但是如果理解了 \(\frac{1}{1 - x}\) 为啥对应前缀和也就不难了。

posted @ 2026-01-13 23:36  xiehanrui0817  阅读(3)  评论(0)    收藏  举报