ABC285H

\(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}\)
那么贡献就是:
因为我们枚举了 \(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}\) 做类比,它是做前缀和。而猜也能猜到, \(\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\),那么有
就有了前面那段代码。也就可以在 \(O(\max E)\) 的时间算出 \(G\),也就是 \(f_m(x)\)。然后枚举 \(E_i\) 后 \(O(1)\) 查询即可。
时间复杂度:\(O(nE)\)
这个题,首先要通过容斥搞成一个生成函数能解决的问题,写出多项式后需要计算 \(f_m(x)\) ,主要给的是 \(\frac{1}{1 + x}\),但是如果理解了 \(\frac{1}{1 - x}\) 为啥对应前缀和也就不难了。
浙公网安备 33010602011771号