CodeForces - 1097F:Alex and a TV Show (bitset & 莫比乌斯容斥)
Alex decided to try his luck in TV shows. He once went to the quiz named "What's That Word?!". After perfectly answering the questions "How is a pseudonym commonly referred to in the Internet?" ("Um... a nick?"), "After which famous inventor we name the unit of the magnetic field strength?" ("Um... Nikola Tesla?") and "Which rock band performs "How You Remind Me"?" ("Um... Nickelback?"), he decided to apply to a little bit more difficult TV show: "What's in This Multiset?!".
The rules of this TV show are as follows: there are n
multisets numbered from 1 to n. Each of them is initially empty. Then, q
events happen; each of them is in one of the four possible types:
- 1 x v — set the x
-th multiset to a singleton {v}
- 2 x y z — set the x
-th multiset to a union of the y-th and the z-th multiset. For example: {1,3}∪{1,4,4}={1,1,3,4,4}
- 3 x y z — set the x
-th multiset to a product of the y-th and the z-th multiset. The product A×B of two multisets A, B is defined as {gcd(a,b)∣a∈A,b∈B}, where gcd(p,q) is the greatest common divisor of p and q. For example: {2,2,3}×{1,4,6}={1,2,2,1,2,2,1,1,3}
- 4 x v — the participant is asked how many times number v
occurs in the x-th multiset. As the quiz turned out to be too hard in the past, participants should now give the answers modulo 2
- only.
Note, that x
, y and z described above are not necessarily different. In events of types 2 and 3
, the sum or the product is computed first, and then the assignment is performed.
Alex is confused by the complicated rules of the show. Can you help him answer the requests of the 4
-th type?
Input
The first line contains two integers n
and q (1≤n≤105, 1≤q≤106
) — the number of multisets and the number of events.
Each of the following q
lines describes next event in the format given in statement. It's guaranteed that 1≤x,y,z≤n and 1≤v≤7000
always holds.
It's guaranteed that there will be at least one event of the 4
-th type.
Output
Print a string which consists of digits 0
and 1 only, and has length equal to the number of events of the 4-th type. The i-th digit of the string should be equal to the answer for the i-th query of the 4
-th type.
Example
4 13
1 1 1
1 2 4
1 3 6
4 4 4
1 4 4
2 2 1 2
2 3 3 4
4 4 4
3 2 2 3
4 2 1
4 2 2
4 2 3
4 2 4
010101
Note
Here is how the multisets look in the example test after each of the events; i
is the number of queries processed so far:
题意:
n个可重集,有Q次操作
1 u v 表示将第u个可重集的元素置为1个v
2 u a b 表示将第u个可重集置为第a个可重集和第b个可重集的并集
3 u a b 表示将第u个可重集置为第a个可重集的每个元素和第b个可重集的每个元素的gcd的并集
4 u v 表示求在第u个可重集中元素v的出现次数是奇数还是偶数
n<=1e5 Q<=1e6 1<=v<=7000
思路:由于是只要求奇数还是偶数,我们整个过程只需要保存0和1即可,我们用莫比乌斯来求是否存在一个gcd,即保存当前集合是因子的奇偶性。那么对于2和3,我们可以直接操作(分别是^ &)了。
假设我们知道了因子的数量的奇偶性,假设保存在s[]里面。 vis[gcd]=mu(d/gcd)*s[d];所以对于每个gcd,我们预处理出mu(d/gcd)!=0的位置d,保存到b[]里面。
由于只求奇偶,1和-1的效果等效,结果和s[x]*b[y]的1的数量奇偶相同;
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const int maxm=;
bitset<maxm>s[maxn],b[maxm];
int mu[maxm],p[maxm],cnt;bool vis[maxm];
vector<int>G[maxm];
void init()
{
mu[]=;
rep(i,,maxm-){
if(!vis[i]) p[++cnt]=i,mu[i]=-;
rep(j,,cnt){
if(i*p[j]>=maxm) break;
vis[i*p[j]]=;
if(!(i%p[j])) {mu[i*p[j]]=; break;}
mu[i*p[j]]=-mu[i];
}
}
rep(i,,maxm-)
for(int j=i,k=;j<=maxm-;j+=i,k++){
G[j].push_back(i);
if(mu[k]!=) b[i][j]=;
}
}
int main()
{
int N,M,opt,x,y,z;
init();
scanf("%d%d",&N,&M);
while(M--){
scanf("%d",&opt);
if(opt==){
scanf("%d%d",&x,&y);
s[x].reset();
rep(i,,G[y].size()-)
s[x][G[y][i]]=s[x][G[y][i]]^;
}
else if(opt==){
scanf("%d%d%d",&x,&y,&z);
s[x]=s[y]^s[z];
}
else if(opt==){
scanf("%d%d%d",&x,&y,&z);
s[x]=s[y]&s[z];
}
else {
scanf("%d%d",&x,&y);
if((s[x]&b[y]).count()&) putchar('');
else putchar('');
}
}
return ;
}
CodeForces - 1097F:Alex and a TV Show (bitset & 莫比乌斯容斥)的更多相关文章
- Codeforces 1097F Alex and a TV Show (莫比乌斯反演)
题意:有n个可重集合,有四种操作: 1:把一个集合设置为单个元素v. 2:两个集合求并集. 3:两个集合中的元素两两求gcd,然后这些gcd形成一个集合. 4:问某个可重复集合的元素v的个数取模2之后 ...
- Codeforces 1097F. Alex and a TV Show
传送门 由于只要考虑 $\mod 2$ 意义下的答案,所以我们只要维护一堆的 $01$ 容易想到用 $bitset$ 瞎搞...,发现当复杂度 $qv/32$ 是可以过的... 一开始容易想到对每个集 ...
- Codeforces Round #330 (Div. 2) B. Pasha and Phone 容斥定理
B. Pasha and Phone Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/595/pr ...
- Codeforces Round #258 (Div. 2) E. Devu and Flowers 容斥
E. Devu and Flowers 题目连接: http://codeforces.com/contest/451/problem/E Description Devu wants to deco ...
- 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 Round #428 (Div. 2) D. Winter is here 容斥
D. Winter is here 题目连接: http://codeforces.com/contest/839/problem/D Description Winter is here at th ...
- codeforces 342D Xenia and Dominoes(状压dp+容斥)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud D. Xenia and Dominoes Xenia likes puzzles ...
- CodeForces - 803F: Coprime Subsequences(莫比乌斯&容斥)
Let's call a non-empty sequence of positive integers a1, a2... ak coprime if the greatest common div ...
- Codeforces Round #330 (Div. 2)B. Pasha and Phone 容斥
B. Pasha and Phone Pasha has recently bought a new phone jPager and started adding his friends' ph ...
随机推荐
- python中的包
- js代码之编程习惯
编程习惯: 异常处理 如果你没有使用异常处理的习惯,这可能是因为你并未真正的理解它的作用.当你正确使用异常处理之后,你会发现你的代码最显著的变化就是:少了很多的 if-else 语句 . 虽然在 JS ...
- shell 变量介绍
变量命名规则 变量名必须以字母或下划线开头,名字中间只能由字母,数字和下划线组成,大小写是区分的 变量名的长度不得超过255个字符 变量名在有效的范围内必须是唯一的 在Bash中,变量的默认类型都是字 ...
- 北邮新生排位赛2解题报告a-c
A. 丁神去谷歌 2014新生暑假个人排位赛02 时间限制 1000 ms 内存限制 65536 KB 题目描述 丁神要去Google上班了,去之前丁神想再做一道水题,但时间不多了,所以他希望题目做起 ...
- Animation和Animator 的区别
此文章转载于极视学堂!!!! ①Animation和Animator 虽然都是控制动画的播放,但是它们的用法和相关语法都是大有不同的. Animation 控制一个动画的播放,而Animator是多个 ...
- linux:centOs7没有eth0网卡
1.修改ifcfg-ens33为ifcfg-eth0 cd /etc/sysconfig/network-scripts/ su root #进入root模式,需要输入 ...
- Java获取后台数据,动态生成多行多列复选框
本例目标: 获取后台数据集合,将集合的某个字段,比如:姓名,以复选框形式显示在HTML页面 应用场景: 获取数据库的人员姓名,将其显示在页面,供多项选择 效果如下: 一.后台 查询数据库,返回List ...
- 4.1 C++多态的概念及前提条件
参考:http://www.weixueyuan.net/view/6370.html 总结: 而多态的功能则是将函数名动态绑定到函数入口地址,这样的动态绑定过程称为运行期绑定. 而在运行期绑定的函数 ...
- c/c++动态内存分配的区别
c中动态内存分配使用malloc和free. malloc指定需要分配的内存大小,分配成功则返回指向该内存的指针,不成功则返回空指针.返回的指针类型为void *,表示不确定指针所指内存存放的数据类型 ...
- DevExpress WinForms v18.2新版亮点(一)
行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress WinForms v1 ...