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. binary hacks读数笔记(ld 链接讲解 一)

    首先我们先看两段代码: a.c extern int shared; int main(){ int a=100; swap(&a,&shared); } b.c int shared ...

  2. JS控制Video播放器(快进、后退、播放、暂停、音量大小)

    思路: 一.首先监听触发事件. 比如:向上键对应的keyCode为38,向下键对应的keyCode为40,向左键对应的keyCode为37,向右键对应的keyCode为39,空格键对应的keyCode ...

  3. Python_爬虫笔记_2018.3.19

    Python_爬虫_笔记 1.前言 1.1爬虫用途: 网站采集.接口采集(地图(jis 热力学 屋里端口/协议).微信.知乎.) 1.2基本流程:网页下载(requests)+网页解析+爬虫调度 网页 ...

  4. css子选择器 :frist-child :nth-child(n) :nth-of-type(n) ::select选择器

    记录一下前一段时间使用.学习的几种选择器. 1. :frist-child 选择器n 比如<ul><li></li> <li></li> & ...

  5. 【SpringCloud】consul注册中心注册的服务为内网(局域网)IP

    一.前因 最近在做公司的一个微服务项目,技术架构为spring cloud + consul + SSM. 当我写完一个功能要在本地测试时,发现服务运行成功,但是前后端联调报500错误. 当时的第一个 ...

  6. java面试必问:多线程的实现和同步机制,一文帮你搞定多线程编程

    前言 进程:一个计算机程序的运行实例,包含了需要执行的指令:有自己的独立地址空间,包含程序内容和数据:不同进程的地址空间是互相隔离的:进程拥有各种资源和状态信息,包括打开的文件.子进程和信号处理. 线 ...

  7. EasyRecovery——信息时代的“后悔药”

    前几日,小编在豆瓣潜水的时候看到这么一个帖子,说是一对小情侣吵架,女方一气之下把男方的博士论文和资料全删了,求一个办法让男友消气. 站在吃瓜的角度,小编和广大群众看法一致,希望两人直接分手,放男方一条 ...

  8. 打开WPS时出现MathType错误弹窗怎么办

    MathType是一款特别优秀的公式编辑器,特别是在文档中出现大量的复杂数学公式需要编辑时.不过MathType与Office的兼容性还算好,与WPS的兼容性要略逊一筹,有时候会出现如下的报错弹窗.提 ...

  9. iOS UITextFeild获取高亮部分的长度

    获取原因: 中英文混输时,会遇到长度统计不准的问题. 获取方法: NSString *toBeString = textField.text; NSString *lang = [[UITextInp ...

  10. Apiview+serallizers

    1.APIVIEW使用 https://www.cnblogs.com/xiaonq/p/10124104.html ModelVIewSet是对APIView封装 ModelSerializer是对 ...