[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 }
View Code

 

posted @ 2021-09-03 22:37  PYWBKTDA  阅读(36)  评论(0编辑  收藏  举报