ABC285Ex Avoid Square Number
02 / 11 / 2023 | 最后修改于 02 / 11 / 2023
首先考虑容斥,记 Fi 为至少存在 i 个平方数的方案数,则
Answer=i=0∑n(−1)i×(in)×Fi
对于 Fi 可以转化为把每个质因数的指数 Ej 拆成至少 i 个偶数的总方案数,则
Fi=j=1∏nfi,Ej
其中 fi,k 为把 k 拆成至少 i 个偶数的方案数,构造 fi 的生成函数如下
Gi(x)=k=0∑∞xk×fi,k
根据经典推导
Gi(x)=(x0+x2+x4+⋯)i×(x0+x1+x2+⋯)n−i=(1−x21)i×(1−x1)n−i=(1−x)n×(1+x)i1
则最终答案为
Answer=i=0∑n(−1)i(in)j=1∏k[xEj](1−x)n×(1+x)i1
注意到我们可以先暴力卷积计算出 G0(x),而每次转移 Gi(x)→Gi+1(x) 只需要乘上 (1+x)−1=1−x+x2−x3+x4⋯
注意到乘 (1−x)−1 等价于做前缀和,乘 (1+x)−1 等价于做前缀差 fi′=fi−fi−1′(但不等于差分)
求出 G0(x) 的复杂度是 O(nEmax),而递推计算 G1(x)∼Gn(x) 的总复杂度也是 O(nEmax),每次通过 Gi(x) 求 Fi 的复杂度是 O(k),执行 n 次,而容斥的复杂度是 O(n)
综上,时间复杂度为 O(nEmax+nk)