[cf1097F]Alex and a TV Show
注意到仅关心于每种数个数的奇偶性,并且以此法操作不影响结果
对其使用bitset维护,即可在$o(\frac{v}{\omega})$的复杂度内完成操作1,2和4
对于操作3,即是一个经典的$\gcd$卷积,记$S_{i}$为第$i$个集合对应的bitset(下标范围为$[1,v]$),那么构造倍数变换$FT(S)_{i}=\bigoplus_{i\mid j}S_{j}$,则有$FT(S_{z})=FT(S_{x})\and FT(S_{y})$(指对应位取and)
(根据莫比乌斯反演,$FT$的逆变换$FT^{-1}$即为$FT^{-1}(S)_{i}=\bigoplus_{j\mid i}\mu(\frac{i}{j})S_{j}$)
根据调和级数,求$FT(S)_{i}$的复杂度为$o(v\log v)$,但由于没有利用bitset的操作,无法通过
注意到操作1和操作4都是单点修改和查询,因此不妨改为维护$FT(S)$
此时,操作1即枚举所有约数,可以暴力或预处理;操作2和操作3即异或和$\and$;操作4即求乘上所有$\mu$非0的数位置上的异或和,预处理后即可通过$\and$和$count$实现
综上,总复杂度为$o(\frac{qv}{\omega})$,可以通过
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 100005 4 #define V 7001 5 bitset<V>dv[V],mul[V],bt[N]; 6 int n,m,p,x,y,z,mu[V]; 7 int main(){ 8 for(int i=1;i<V;i++){ 9 mu[i]=1; 10 for(int j=2;j*j<=i;j++) 11 if (i%(j*j)==0)mu[i]=0; 12 } 13 for(int i=1;i<V;i++) 14 for(int j=i;j<V;j+=i){ 15 dv[j][i]=1; 16 mul[i][j]=mu[j/i]; 17 } 18 scanf("%d%d",&n,&m); 19 for(int i=1;i<=m;i++){ 20 scanf("%d%d%d",&p,&x,&y); 21 if (p==1)bt[x]=dv[y]; 22 if (p==2){ 23 scanf("%d",&z); 24 bt[x]=(bt[y]^bt[z]); 25 } 26 if (p==3){ 27 scanf("%d",&z); 28 bt[x]=(bt[y]&bt[z]); 29 } 30 if (p==4)printf("%d",((bt[x]&mul[y]).count()&1)); 31 } 32 return 0; 33 }