【Codeforces 1097F】Alex and a TV Show(bitset & 莫比乌斯反演)
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\) 的值,下同)
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\):
\]
我们发现 \(\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 & 莫比乌斯反演)的更多相关文章
- Codeforces 1097F. Alex and a TV Show
传送门 由于只要考虑 $\mod 2$ 意义下的答案,所以我们只要维护一堆的 $01$ 容易想到用 $bitset$ 瞎搞...,发现当复杂度 $qv/32$ 是可以过的... 一开始容易想到对每个集 ...
- Codeforces 1097F Alex and a TV Show (莫比乌斯反演)
题意:有n个可重集合,有四种操作: 1:把一个集合设置为单个元素v. 2:两个集合求并集. 3:两个集合中的元素两两求gcd,然后这些gcd形成一个集合. 4:问某个可重复集合的元素v的个数取模2之后 ...
- 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 ...
- codeforces#1139D. Steps to One (概率dp+莫比乌斯反演)
题目链接: http://codeforces.com/contest/1139/problem/D 题意: 在$1$到$m$中选择一个数,加入到一个初始为空的序列中,当序列的$gcd$和为$1$时, ...
- Codeforces Round #548 (Div. 2) D 期望dp + 莫比乌斯反演
https://codeforces.com/contest/1139/problem/D 题意 每次从1,m中选一个数加入队列,假如队列的gcd==1停止,问队列长度的期望 题解 概率正着推,期望反 ...
- CF1097F Alex and a TV Show
题目地址:CF1097F Alex and a TV Show bitset+莫比乌斯反演(个人第一道莫比乌斯反演题) 由于只关心出现次数的奇偶性,显然用bitset最合适 但我们并不直接在bitse ...
- 【CF1097F】Alex and a TV Show(bitset)
[CF1097F]Alex and a TV Show(bitset) 题面 洛谷 CF 题解 首先模\(2\)意义下用\(bitset\)很明显了. 那么问题在于怎么处理那个\(gcd\)操作. 然 ...
- CF1097F Alex and a TV Show 莫比乌斯反演、bitset
传送门 发现自己对mobius反演的理解比较浅显-- 首先我们只需要维护每一个数的出现次数\(\mod 2\)的值,那么实际上我们只需要使用\(bitset\)进行维护,每一次加入一个数将其对应次数异 ...
- 【CF1097F】Alex and a TV Show
[CF1097F]Alex and a TV Show 题面 洛谷 题解 我们对于某个集合中的每个\(i\),令\(f(i)\)表示\(i\)作为约数出现次数的奇偶性. 因为只要因为奇偶性只有\(0, ...
随机推荐
- Socket 套接字的系统调用
socket 结构 /** * struct socket - general BSD socket * @state: socket state (%SS_CONNECTED, etc) * @ty ...
- 04 . Vue组件注册,组件间数据交互,调试工具及组件插槽介绍及使用
vue组件 组件(Component)是 Vue.js 最强大的功能之一. 组件可以扩展 HTML 元素,封装可重用的代码. 组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的 ...
- 一文解析TCP/UDP
声明:本文部分内容来自互联网.书籍等渠道,表示感谢: 转载请注明出处:@热风.https://www.cnblogs.com/refeng/p/13996657.html 目录 TCP/UDP详解 1 ...
- symfony中,使用原声的sql语句
1 /** 2 * 数组形式的原生sql 3 */ 4 public function arrayA(array $did) 5 { 6 $statement = $this->getEntit ...
- 3. git命令行操作之远程库操作
3.1 基本操作 注册GitHub账号 在本地创建一个本地库并初始化 登录到gitHub创建一个远程库 注意:windows的凭据管理器中会保存github登录信息.如果要切换登录者,先删除相应凭据 ...
- 2017年第八届蓝桥杯【C++省赛B组】B、C、D、H 题解
可能因为我使用暴力思维比较少,这场感觉难度不低. B. 等差素数列 #暴力 #枚举 题意 类似:\(7,37,67,97,127,157\) 这样完全由素数组成的等差数列,叫等差素数数列. 上边的数列 ...
- Matlab 数值计算
本博客记录一些简单的计算 det(A):矩阵求行列式 A=[1,2;3,4]; det(A) ans=-2; inv(A):矩阵求逆 A=[1,2;3,4]; B=inv(A) B=[-2,1;1,5 ...
- 可变长形参,增强for语句
`package 可变长形参; public class VarArgumen { public static int max(int...varArgs) {//就有可变长形参的求最大值方法 //可 ...
- BackgroundService 大佬教的好
BackgroundService 源码分析 因为换了工作也有两个多月没有写博客啦,因为跟着红超哥(大佬)一直在学习和做项目(反正就是在潜心修炼,大佬每天也是在我十万个为什么中度过的.) 最近在做一个 ...
- 测试:ADB
配置 JAVA: 1.安装jdk的按抓包(傻瓜式安装不需要更改路径) 2.我的电脑右击属性--高级系统设置--环境变量--用户变量--新建:JAVA_HOME C:\Program Files\Jav ...