原根 + $NTT$ .
$M$ 是奇质数,可以先求出它的一个原根 $g_M$ ,将 $S$ 中的每个元素以及 $x$ 都转化为以 $g_M$ 为底的对数.
找 $M$ 的原根时,先预处理出 $M-1$ 的每个质因数 $p_i$ .
从 $2$ 开始枚举每个数,检验它是否为原根.
只需要对于每个 $i$ ,依次算出 $g^{(M-1)/p_i}$ ,若这些数中有 $1$ ,则 $g$ 不是原根,否则是原根.
于是 $\prod a_i\bmod M=x$ 就变成了 $\sum a_i’\bmod (M-1)=x’$ .
利用生成函数计算,就是要求多项式 $A(x)^n \bmod x^{M-1}$ 第 $x’$ 项的系数.
系数模数是 $NTT$ 模数,由于 $m$ 比较小,用不着多项式快速幂,可以直接写倍增快速幂.
时间复杂度 $O(m\log n\log m)$ .
注意 $x$ 不可以为 $0$ ,要将集合中为 $0$ 的元素忽略掉.
1 | //%std |