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. [原题复现]ByteCTF 2019 –WEB- Boring-Code[无参数rce、绕过filter_var(),等]

    简介  原题复现:  考察知识点:无参数命令执行.绕过filter_var(), preg_match()  线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使 ...

  2. [原题复现+审计][RoarCTF 2019]Easy Calc(http协议走私、php字符串解析漏洞)

    简介  原题复现:  考察知识点:http协议走私.php字符串解析漏洞  线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到 ...

  3. C# 中的本地函数

    今天我们来聊一聊 C# 中的本地函数.本地函数是从 C# 7.0 开始引入,并在 C# 8.0 和 C# 9.0 中加以完善的. 引入本地函数的原因 我们来看一下微软 C# 语言首席设计师 Mads ...

  4. ABBYY FineReader 15 新增编辑表格单元格功能

    ABBYY FineReader 15(Windows系统)新增编辑表格单元格功能,在PDF文档存在表格的前提下,可将表中的每个单元格作为单独的文字块进行单独编辑,单元格内的编辑不会影响同一行中其他单 ...

  5. symfony框架中使用service

    在config文件里面的service.yml写入自己service 1 chat.group_list: //service的名字 2 class: Chat\Service\GroupListSe ...

  6. leetcode151. 翻转字符串里的单词

    给定一个字符串,逐个翻转字符串中的每个单词. 示例 1:输入: "the sky is blue"输出: "blue is sky the"示例 2:输入: & ...

  7. 牛客练习赛71 数学考试 题解(dp)

    题目链接 题目大意 要你求出有多少个长度为n的排列满足m个限制条件 第i个限制条件 p[i]表示前 p[i]个数不能是1-p[i]的排列 题目思路 这个感觉是dp但是不知道怎么dp 首先就是要明白如果 ...

  8. Foreground-aware Image Inpainting

    引言 语义分割得到边缘信息指导修复其三 存在问题:现在的图像修复方法主要的通过周围像素来修复,当修复区域与前景区域(显著物体)有交叠时,由于修复区域缺失前景与背景的时间内容导致修复结果不理想. 提出方 ...

  9. LaTeX的字体字号设置

    字体属性: 字体族代码及注释: 显示效果: 字体系列设置及字体形状设置代码及注释: 显示效果: 字体大小及中文字号的设置代码及注释: 显示效果: ctex文档有关中文字号的排版: ctex文档的打开方 ...

  10. Beta冲刺——用户测试报告

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta 冲刺 这个作业的目标 团队进行Alpha冲刺 作业正文 正文 其他参考文献 无 用户测试报告 用户 ...