「CF1097F」Alex and a TV Show

Description

Link:CF1097F

维护 nn 个初始为空的可重集。有 QQ 次操作,每次操作形如以下四种之一:

  • 1 x v:令集合 xx 等于 {v}\{v\}。
  • 2 x y z:令集合 xx 等于集合 yy 与 zz 的并。
  • 3 x y z:令集合 xx 等于集合 yy 与 zz 的积,A×B={gcd⁡(a,b)∣a∈A,b∈B}A \times B = \{\gcd(a, b) \mid a \in A, b \in B\}。
  • 4 x v:询问 vv 在集合 xx 中出现次数模 22 的结果。

数据范围:1≤n≤1051 \leq n \leq 10^5,1≤q≤1061 \leq q \leq 10^6,1≤v≤70001 \leq v \leq 7000。

时空限制:33s / 250250MiB。

Solution

注意到 v≤7000v \leq 7000 很小。设 a[x][v]a[x][v] 表示集合 xx 中,vv 的倍数的出现次数 mod 2 的值。使用 std::bitset 来维护 a[x]a[x]。

  • 1 x v:枚举 vv 的因数更新 a[x]a[x] 即可。
  • 2 x y z:a[x]←a[y]xora[z]a[x] \gets a[y] \mathbin{\mathrm{xor}} a[z]。
  • 3 x y z:a[x]←a[y]anda[z]a[x] \gets a[y] \mathbin{\mathrm{and}} a[z]。
  • 4 x v:设 f(v)f(v) 表示 vv 的倍数的出现次数,设 g(v)g(v) 表示 vv 的出现次数,则

f(v)=∑v∣dg(d)  ⟺  g(v)=∑v∣df(d)μ(dv)f(v) = \sum\limits_{v \mid d} g(d) \iff g(v) = \sum\limits_{v \mid d} f(d) \mu\left( \frac{d}{v} \right)

对每个数 vv 再开个 std::bitset h[v]h[v],其中 h[v][v⋅d]=μ(d) mod 2h[v][v \cdot d] = \mu(d) \bmod 2。答案即为 (a[x]andh[v]).count() mod 2(a[x] \mathbin{\mathrm{and}} h[v]).\mathrm{count}() \bmod 2。

时间复杂度 O(q(v+vw))\mathcal{O}(q(\sqrt{v} + \frac{v}{w}))。