「CF1097F」Alex and a TV Show

Description

Link:CF1097F

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

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

数据范围:1n1051 \leq n \leq 10^51q1061 \leq q \leq 10^61v70001 \leq v \leq 7000

时空限制:33s / 250250MiB。

Solution

注意到 v7000v \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 za[x]a[y]xora[z]a[x] \gets a[y] \mathbin{\mathrm{xor}} a[z]
  • 3 x y za[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)=vdg(d)    g(v)=vdf(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][vd]=μ(d)mod2h[v][v \cdot d] = \mu(d) \bmod 2。答案即为 (a[x]andh[v]).count()mod2(a[x] \mathbin{\mathrm{and}} h[v]).\mathrm{count}() \bmod 2

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