Codeforces 1097F Alex and a TV Show (莫比乌斯反演)
题意:有n个可重集合,有四种操作:
1:把一个集合设置为单个元素v。
2:两个集合求并集。
3:两个集合中的元素两两求gcd,然后这些gcd形成一个集合。
4:问某个可重复集合的元素v的个数取模2之后是多少。
思路:因为集合的元素是对2取模,那么我们可以用bitset来代替可重复集合。但是,如果每个bitset来直接代表多重集的话,第三个操作会很麻烦。所以我们每个集合的bitset用来代表每个元素和每个元素约数的集合,这样某个约数为标记为1说明这个约数的倍数的和为奇数(这个约数的倍数就是这个元素)这样第三个操作实际上就是两个bitset互相AND。为什么呢?新的集合数x是奇数,只有当第一个集合和第二个集合的x也是奇数个才行。那么这种情况下怎么知道某个集合的元素v有多少个呢?我们令f(n)为询问的集合元素n的个数,g(d)为询问的集合中d及其倍数的元素的个数,那么我们可列出表达式:g(d) = ∑(d|n) (f(n)),我们反演一下,可得f(d) = ∑(d|n)(mo(n / d) * g(n)) (mo是莫比乌斯函数)。因为答案取模2,而在%2意义下-1和1是一样的,所以我们可以预处理出来n的数中哪些莫比乌斯函数值是1,哪些是0,存在一个bitset里。g(n)囊括在了每个多重集的bitset里了,那么把这个两个bitsetAND一下,算一下1的个数取模2,就是最终答案。
代码和思路参考了这篇博客:https://www.cnblogs.com/cjyyb/p/10283115.html
代码:
#include <bits/stdc++.h>
#define bit bitset<7001>
using namespace std;倍数
const int maxn = 100010;
bit a[maxn], b[7001], mup[7001], f[7001];
bool mu[7001];
void init() {
mu[1] = 1;
for (int i = 1; i <= 7000; i++)
for (int j = i + i; j <= 7000; j += i)
mu[j] -= mu[i];
for (int i = 1; i <= 7000; i++)
for (int j = i; j <= 7000; j += i)
f[j][i] = 1;
for (int i = 1; i <= 7000; i++)
for (int j = i; j <= 7000; j += i)
if(mu[j / i]) mup[i][j] = 1;
}
int main() {
int n, m, op, x, y, z;
init();
scanf("%d%d", &n, &m);
while(m--){
scanf("%d", &op);
if(op == 1) {
scanf("%d%d", &x, &y);
a[x] = f[y];
} else if(op == 2) {
scanf("%d%d%d", &x, &y, &z);
a[x] = a[y] ^ a[z];
} else if(op == 3) {
scanf("%d%d%d", &x, &y, &z);
a[x] = a[y] & a[z];
} else {
scanf("%d%d", &x, &y);
printf("%d", (a[x] & mup[y]).count() & 1);
}
}
}
Codeforces 1097F Alex and a TV Show (莫比乌斯反演)的更多相关文章
- Codeforces 1097F. Alex and a TV Show
传送门 由于只要考虑 $\mod 2$ 意义下的答案,所以我们只要维护一堆的 $01$ 容易想到用 $bitset$ 瞎搞...,发现当复杂度 $qv/32$ 是可以过的... 一开始容易想到对每个集 ...
- CF1097F Alex and a TV Show 莫比乌斯反演、bitset
传送门 发现自己对mobius反演的理解比较浅显-- 首先我们只需要维护每一个数的出现次数\(\mod 2\)的值,那么实际上我们只需要使用\(bitset\)进行维护,每一次加入一个数将其对应次数异 ...
- 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 809E - Surprise me!(虚树+莫比乌斯反演)
Codeforces 题目传送门 & 洛谷题目传送门 1A,就 nm 爽( 首先此题一个很棘手的地方在于贡献的计算式中涉及 \(\varphi(a_ia_j)\),而这东西与 \(i,j\) ...
- Codeforces - 1139D - Steps to One (概率DP+莫比乌斯反演)
蒟蒻数学渣呀,根本不会做. 解法是参考 https://blog.csdn.net/xs18952904/article/details/88785210 这位大佬的. 状态的设计和转移如上面博客一样 ...
- Codeforces.547C.Mike and Foam(容斥/莫比乌斯反演)
题目链接 \(Description\) 给定n个数(\(1\leq a_i\leq 5*10^5\)),每次从这n个数中选一个,如果当前集合中没有就加入集合,有就从集合中删去.每次操作后输出集合中互 ...
- 【Codeforces 1097F】Alex and a TV Show(bitset & 莫比乌斯反演)
Description 你需要维护 \(n\) 个可重集,并执行 \(m\) 次操作: 1 x v:\(X\leftarrow \{v\}\): 2 x y z:\(X\leftarrow Y \cu ...
- 【CF1097F】Alex and a TV Show(bitset)
[CF1097F]Alex and a TV Show(bitset) 题面 洛谷 CF 题解 首先模\(2\)意义下用\(bitset\)很明显了. 那么问题在于怎么处理那个\(gcd\)操作. 然 ...
- CF1097F Alex and a TV Show
题目地址:CF1097F Alex and a TV Show bitset+莫比乌斯反演(个人第一道莫比乌斯反演题) 由于只关心出现次数的奇偶性,显然用bitset最合适 但我们并不直接在bitse ...
随机推荐
- python中常用的文件和目录操作(二)
一. os模块概述 python os模块提供了非常丰富的方法用来处理文件和目录 二. 导入os模块: import os 三. 常用方法 1. os.name 输出字符串表示正在使用的平台,如果是w ...
- poj2942 点-双联通+二分图染色
题意:有一群骑士要坐在一个圆形的桌子上,他们之间有些人相互讨厌,所以不能挨着,要求算出一次也不能坐在桌子上的人,每次会议桌子必须奇数个人,一个人不能开会 题解:可以先建一个补图,要满足题目条件我们只要 ...
- Swift中如何使用 #if DEBUG
Swift暂时还不支持大多数的预处理宏操作,但是可以支持“#if/#else/#endif”语句. 下面进行简单的设置使 #if DEBUG 有效,更详细的内容见:http://stackoverfl ...
- 51nod 1255 贪心/构造
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1255 1255 字典序最小的子序列 题目来源: 天津大学OJ 基准时间限 ...
- python MySQLdb连接mysql失败(转载)
最近了解了一下django,数据库选用了mysql, 在连接数据库的过程中,遇到一点小问题,在这里记录一下,希望能够对遇到同样的问题的朋友有所帮助,少走一些弯路.关于django,想在这里也额外说一句 ...
- JS开发页面小组件:table组件
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 17 python 内置函数
内置函数:Python的内部自带的函数 作用域相关: 基于字典的形式获取局部变量和全局变量 globals()——获取全局变量的ha1 locals()——获取执行本方法所在命名空间内的局部变量的字典 ...
- KVM- vnc配置
本文是通过vnc方式访问虚拟主机上的KVM虚拟机. 这里的通过vnc方式访问虚拟机不是在kvm虚拟机安装配置vnc服务器,通过虚拟主机的IP地址与端口进行访问,kvm虚拟化对vnc的支持相对来说比xe ...
- eclipse 环境 JUnit 测试框架(junit.framework.* 与 org.junit.*)
如下所示,先通过 build path 导入 junit 环境依赖的 jar 包: 1. junit.framework.* junit.framework.* 主要类和函数: Test TestCa ...
- UVALive - 5031 Graph and Queries (并查集+平衡树/线段树)
给定一个图,支持三种操作: 1.删除一条边 2.查询与x结点相连的第k大的结点 3.修改x结点的权值 解法:离线倒序操作,平衡树or线段树维护连通块中的所有结点信息,加个合并操作就行了. 感觉线段树要 ...