UOJ #888. 【UNR #8】里外一致
唉,不会生成函数。
考虑一种出现次数为 \(x\) 的数,它可以被分到其中一边,也可以两边同时分。前者会有 \(1\) 的系数,后者会有 \(2^x-2\) 的系数。
用生成函数来刻画,则一种出现次数为 \(c\) 的数的 GF 为 \(x+\frac{1}{x}+2^c-2\),而我们要求的就是所有出现过的数的 GF 乘起来以后 \(0\) 次项的系数。
将上面的 GF 进一步改写为 \(((\sqrt x-\frac{1}{\sqrt x})^2+2^c)\),则设 \(z=(\sqrt x-\frac{1}{\sqrt x})^2\),可以写出一个 DP,记 \(f_i\) 表示有 \(i\) 个没有选 \(z\),由于模数的特殊性质,\(i\leq 64\)。使用莫队可以做到 \(O(n\sqrt q\log p)\)。
但是这还不够优。使用莫队求出出现次数为 \(i\) 的数有几种后,按照出现次数从大到小进行这个 DP。当考虑到出现次数为 \(i\) 的数的时候, \(dp\) 的状态数不超过 \(\frac{\log p}{i}\),因此 dp 的复杂度就是 \(\sum \frac{\log ^2p}{i^2}=O(\log ^2p)\),总复杂度就是 \(O(n\sqrt q+q\log ^2p)\)。