Description
Link:CF1097F
维护 n 个初始为空的可重集。有 Q 次操作,每次操作形如以下四种之一:
1 x v:令集合 x 等于 {v}。
2 x y z:令集合 x 等于集合 y 与 z 的并。
3 x y z:令集合 x 等于集合 y 与 z 的积,A×B={gcd(a,b)∣a∈A,b∈B}。
4 x v:询问 v 在集合 x 中出现次数模 2 的结果。
数据范围:1≤n≤105,1≤q≤106,1≤v≤7000。
时空限制:3s / 250MiB。
Solution
注意到 v≤7000 很小。设 a[x][v] 表示集合 x 中,v 的倍数的出现次数 mod 2 的值。使用 std::bitset 来维护 a[x]。
1 x v:枚举 v 的因数更新 a[x] 即可。
2 x y z:a[x]←a[y]xora[z]。
3 x y z:a[x]←a[y]anda[z]。
4 x v:设 f(v) 表示 v 的倍数的出现次数,设 g(v) 表示 v 的出现次数,则
f(v)=v∣d∑g(d)⟺g(v)=v∣d∑f(d)μ(vd)
对每个数 v 再开个 std::bitset h[v],其中 h[v][v⋅d]=μ(d)mod2。答案即为 (a[x]andh[v]).count()mod2。
时间复杂度 O(q(v+wv))。