状压 $dp$ + $FWT$ .
若将每个数分解质因数,则 $\rm gcd,lcm$ 的限制等价于给出了每个质因子次数的 $\min,\max$ .
注意到 $n$ 的不同质因子个数 $\omega(n)\le 8$ ,比较少.
用一个 $16$ 位的二进制数 $S$ 表示各个质因子的 $\min,\max$ 是否被取到.
只有那些既是 $\rm gcd$ 倍数,又是 $\rm lcm$ 约数的数才有用,把它们全部爆搜出来,记这样的数共有 $m$ 个.
记 $f(i,S)$ 表示考虑了第 $1\sim i$ 个数,是否被取到的状态为 $S$ 的方案数.
记 $g(i,S)$ 表示考虑了第 $i\sim m$ 个数,是否被取到的状态为 $S$ 的方案数.
那么强制要求选第 $i$ 个数时,就把 $f(i-1)$ 和 $g(i+1)$ 用 $FWT$ 做个或卷积.
将那些与第 $i$ 个数的状态 $S_i$ 或起来后为全集 $U$ 的位置上的值加起来,就是答案.
$m$ 并不会太大,可以将每次询问的答案记忆化下来,时间复杂度 $O(Q+m\cdot 4^{\omega(n)} \omega(n))$ .
实测发现 $m< 800$ .
1 | //%std |