【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, ...
随机推荐
- 邻居子系统 arp 状态图
- lseek系统调用
文件的随机读写.目前为止,文件都是顺序访问.读写都是从当前文件的偏移位置开始,然后文件偏移值自动的增加到刚好超出读或者写结束的位置是它为下一次作好准备.在linux中有文件偏移.使得随机访问变得简单, ...
- EF Core 二 、 入门 EF Core
入门EF Core 我们将开始真正的EF之旅了,这里使用SqlServer数据,然后DbFirst: 为嘛使用SqlServer,目前公司的整体业务全部在SqlSever,所以很多产品业务都是依托于这 ...
- Linux下查询外网IP的办法。
Curl 纯文本格式输出:curl icanhazip.comcurl ifconfig.mecurl curlmyip.comcurl ip.appspot.comcurl ipinfo.io/ip ...
- 重闯Sqli-labs关卡第三天(11-15关)
前言 今天早上学了学网易云课堂的注入课程突然感觉网易云可i春秋联合出品的课程还不错,之后就刷了刷攻防世界的题,题有眉目但是还是忍不住看了WP 服了自己了!!!一直刷到了晚上也不知道几点我妈买了柚子回了 ...
- YARN-MapReduce的作业提交流程
YARN分布式资源管理系统 组成: ResourceManager:YARN的资源管理器,主节点,通过NodeManager管理集群中所有的资源 NodeManager:YARN的节点管理器,从节点, ...
- 用FL Studio来给电子音乐混音的方法
FL Studio也算是音乐人用的比较多的编曲.混音软件了,FL Studio的一大的特色就是电子音乐的制作.尤其是对混音的操作,混音是电音制作过程中一个非常重要的环节,非常重要. 混音是什么?混音的 ...
- Folx好用的下载功能介绍
Folx作为一款使用便捷的Mac系统下载软件,为用户提供了网页链接捕获.种子文件下载.智能标签等功能,而其Folx专业版更为用户提供了智能控制速度.计划下载任务.种子文件搜索下载等更加智能化的功能. ...
- laravel数据填充
post表有这2个字段 填充20条数据, 执行 php artisan tinker 执行预览 factory(App\Post::class,20)->make(); 插入数据库 factor ...
- 关于String类的一些知识点
//原链接:https://blog.csdn.net/songylwq/article/details/7297004 String str=new String("abc"); ...