Description

你需要维护 \(n\) 个可重集,并执行 \(m\) 次操作:

  • 1 x v:\(X\leftarrow \{v\}\);
  • 2 x y z:\(X\leftarrow Y \cup Z\);
  • 3 x y z:\(X \leftarrow \{\gcd(a, b)\ |\ a\in Y, b\in Z\}\);
  • 4 x v:询问 \(v\) 在 \(X\) 中出现次数 \(\bmod 2\) 的结果。

Hint

\(1\le n\le 10^5, 1\le m\le 10^6, 1\le v\le 7\times 10^3\)。

Solution

由于最终结果只需要保留其奇偶性,那么不难想到异或。\(1\) 异或奇数次为 \(1\),偶数次为 \(0\)。

于是直接用 bitset 来维护集合中每个数字出现次数的奇偶性。那么操作一相当于直接将 bitset 清零,然后 \(v\) 位置为 \(1\)。操作二直接 bitset 按位异或。操作四显然。

然而操作三就出事情了,不过这个 \(\gcd\) 启发我们向约数方向去考虑。

假如说我们维护的并不是数集中的数,而是这些数的因子出现次数的奇偶性,那么对于操作一、二,分别重新赋值(约数的 bitset 可以预处理),按位异或。操作三其实可以简单转化为按位与,推导如下:

(记 \(S_X(j)\) 为集合 \(X\) 中 \(j\) 的个数 \(\bmod 2\) 的值,\(D_X(j)\) 为集合 \(X\) 中的数字的约数中 \(j\) 的个数 \(\bmod 2\) 的值,下同)

\[\begin{aligned}
D_X(i) &\equiv \sum_{j\in Y}\sum_{k\in Z} S_Y(j)S_Z(k)[i\ |\ \gcd(j, k)] &\pmod 2 \\
& \equiv \sum_{j\in Y}S_Y(j)[i \ |\ j]\sum_{k\in Z}S_Z(k)[i\ |\ k] &\pmod 2\\
& \equiv D_Y(i)\times D_Z(i) &\pmod 2\\
\end{aligned}
\]

然后这个乘法相当于按位与运算。

最后考虑操作四。首先我们有莫比乌斯反演,通过这个我们可以把现在维护的 \(D\) 搞成 \(S\):

\[D_X(i) = \sum_{i\ |\ j} S_X(j) \quad\Leftrightarrow\quad S_X(i)=\sum_{i\ |\ j}\mu\left(\tfrac j i\right)D_X(i)
\]

我们发现 \(\mu\) 函数的取值只有 \(\pm 1\) 和 \(0\),且 \(-1 \bmod 2 = 1\)。所以其实这个 \(\mu\left(\frac j i\right)\) 也可以预处理成 bitset,然后直接和 \(D_X\) 按位与然后 count() 即可。

预处理复杂度可以做到 \(O(v\log v)\),单次操作是 \(O(\frac v \omega)\) 的。

Code

/*
* Author : _Wallace_
* Source : https://www.cnblogs.com/-Wallace-/
* Problem : Codeforces 1097F Alex and a TV Show
*/
#include <algorithm>
#include <bitset>
#include <cctype>
#include <cstdio> using namespace std;
const int V = 7e3 + 1;
const int N = 1e5 + 5; inline int read() {
int x = 0; char c = getchar();
while (!isdigit(c)) c = getchar();
while (isdigit(c)) x = (x << 1) + (x << 3) + c - 48, c = getchar();
return x;
} bitset<V> divr[V];
bitset<V> mu_d[V]; // mu[x][y] = mu(y/x) int p[V], mu[V], tot;
bool flag[V];
void init() {
mu[1] = 1;
for (int i = 2; i < V; i++) {
if (!flag[i]) p[++tot] = i, mu[i] = -1;
for (int j = 1; j <= tot && p[j] * i < V; j++) {
flag[i * p[j]] = 1;
if (i % p[j] == 0) break;
mu[i * p[j]] = -mu[i];
}
}
for (int i = 1; i < V; i++)
for (int j = i; j < V; j += i)
divr[j].set(i), mu_d[i][j] = (mu[j / i] != 0);
} int n, m;
bitset<V> val[N]; signed main() {
n = read(), m = read(), init();
for (int op, x, y, z, v; m; --m) {
op = read(), x = read();
switch (op) {
case 1 : v = read(), val[x] = divr[v]; break;
case 2 : y = read(), z = read(), val[x] = val[y] ^ val[z]; break;
case 3 : y = read(), z = read(), val[x] = val[y] & val[z]; break;
case 4 : v = read(), putchar(((mu_d[v] & val[x]).count() & 1) + 48); break;
}
}
}

【Codeforces 1097F】Alex and a TV Show(bitset & 莫比乌斯反演)的更多相关文章

  1. Codeforces 1097F. Alex and a TV Show

    传送门 由于只要考虑 $\mod 2$ 意义下的答案,所以我们只要维护一堆的 $01$ 容易想到用 $bitset$ 瞎搞...,发现当复杂度 $qv/32$ 是可以过的... 一开始容易想到对每个集 ...

  2. Codeforces 1097F Alex and a TV Show (莫比乌斯反演)

    题意:有n个可重集合,有四种操作: 1:把一个集合设置为单个元素v. 2:两个集合求并集. 3:两个集合中的元素两两求gcd,然后这些gcd形成一个集合. 4:问某个可重复集合的元素v的个数取模2之后 ...

  3. Codeforces 1097 Alex and a TV Show

    传送门 除了操作 \(3\) 都可以 \(bitset\) 现在要维护 \[C_i=\sum_{gcd(j,k)=i}A_jB_k\] 类比 \(FWT\),只要求出 \(A'_i=\sum_{i|d ...

  4. codeforces#1139D. Steps to One (概率dp+莫比乌斯反演)

    题目链接: http://codeforces.com/contest/1139/problem/D 题意: 在$1$到$m$中选择一个数,加入到一个初始为空的序列中,当序列的$gcd$和为$1$时, ...

  5. Codeforces Round #548 (Div. 2) D 期望dp + 莫比乌斯反演

    https://codeforces.com/contest/1139/problem/D 题意 每次从1,m中选一个数加入队列,假如队列的gcd==1停止,问队列长度的期望 题解 概率正着推,期望反 ...

  6. CF1097F Alex and a TV Show

    题目地址:CF1097F Alex and a TV Show bitset+莫比乌斯反演(个人第一道莫比乌斯反演题) 由于只关心出现次数的奇偶性,显然用bitset最合适 但我们并不直接在bitse ...

  7. 【CF1097F】Alex and a TV Show(bitset)

    [CF1097F]Alex and a TV Show(bitset) 题面 洛谷 CF 题解 首先模\(2\)意义下用\(bitset\)很明显了. 那么问题在于怎么处理那个\(gcd\)操作. 然 ...

  8. CF1097F Alex and a TV Show 莫比乌斯反演、bitset

    传送门 发现自己对mobius反演的理解比较浅显-- 首先我们只需要维护每一个数的出现次数\(\mod 2\)的值,那么实际上我们只需要使用\(bitset\)进行维护,每一次加入一个数将其对应次数异 ...

  9. 【CF1097F】Alex and a TV Show

    [CF1097F]Alex and a TV Show 题面 洛谷 题解 我们对于某个集合中的每个\(i\),令\(f(i)\)表示\(i\)作为约数出现次数的奇偶性. 因为只要因为奇偶性只有\(0, ...

随机推荐

  1. drop_cache-sar

    查线上问题: 1.cpu  idle 为0 ,I/O高, pidstat 发现进程io 不高,那就是cache mem引起系统io高了 没有vmstat,只能使用sar工具了,使用sar -r  查看 ...

  2. NOIP前一些题目的理解

    ZYB和售货机(图论,环) 题目链接 个人感觉这道题与基环树没有任何关系,你会发现,每个点最多只有一个入度和出度,所以只能是链或环. 还有就是本题的突破点就在于正确建图,题目的限制保证每个点的入度不大 ...

  3. 环境安装和pycharm中一些基本设置

    一.Pycharm的使用和Python环境 1.python和pycharm的安装 python推荐版本3.7/3.8 pycharm选择社区版本 查看python版本在cmd中输入"pyt ...

  4. Windows SMBv3 CVE-2020-0796 漏洞分析和l漏洞复现

    0x00  漏洞描述 漏洞公告显示,SMB 3.1.1协议中处理压缩消息时,对其中数据没有经过安全检查,直接使用会引发内存破坏漏洞,可能被攻击者利用远程执行任意代码.攻击者利用该漏洞无须权限即可实现远 ...

  5. 信息收集之——旁站、C段

    旁站的概念 ​旁站指的是同一服务器上的其他网站,很多时候,有些网站可能不是那么容易入侵.那么,可以查看该网站所在的服务器上是否还有其他网站.如果有其他网站的话,可以先拿下其他网站的webshell,然 ...

  6. C++中new和malloc区别

    面试中new和malloc区别会被经常问到,审视了自己,发现不知道该怎么表达 整理一下: 1.从属性 new/delete是C++关键字,需要编译器支持: malloc/free是库函数,需要头文件支 ...

  7. Android呼吸灯添加

    平台:mtk 一.hal层入口    Lights.c (vendor\mediatek\proprietary\hardware\liblights)     char const*const RE ...

  8. 将多个PDF文件整合成一个文件

    pdfFactory不仅可以将单个文件创建为PDF文件进行打印,还可以将多个文件整合为一个PDF文件,同时,也可以随时删除其中的一些文件,创建新的PDF文件. 图1:pdfFactory工具界面 一. ...

  9. MathType在AutoCAD中的应用方法

    我们都知道CAD是一款鼎鼎有名设计与绘图软件,有不少朋友可能用过或听说过CAD,相较而言,用过MathType的人可能要少一些,虽然它也是理科生与工科生的专用工具之一. 通过MathType我们能够在 ...

  10. php bypass disable_function 命令执行 方法汇总简述

    1.使用未被禁用的其他函数 exec,shell_exec,system,popen,proc_open,passthru (python_eval?perl_system ? weevely3 wi ...