【2017多校】HDU6085 Rikka with Candies

来源:互联网 发布:java打印方法签名 编辑:程序博客网 时间:2024/06/04 01:18

传送门


k,bj>k,ai>=k,ai%bj=k
bbi={i>kb[1...m]}
k=ni=1bbaik
bitseta,bitsetA>>kak,<0
bitsetBB[i]=bbi & 1
ans[k]=(bitsetA>>k) & bitsetBB.count() & 1

bb,bi,,O(N1bi)
N=O(NNi=11N)O(Nln(N+1))
k,bitsetAbitsetBBandO(N232)
O(N232+Nln(N+1))

#include<stdio.h>#include<bits/stdc++.h>#define ll long long#define pii pair<int,int>#define pll pair<ll,ll>#define MEM(a,x) memset(a,x,sizeof(a))#define lowbit(x) ((x)&-(x))using namespace std;const int N = 50000 +5;bitset<N>a,b,ans;bitset<N>bb;//b的倍数,bb[i]=1 : 有奇数个y满足 i%b[y]==0void slove(int maxK){    bb.reset();    ans.reset();    for(int i=maxK;i>=0;--i){//枚举k        ans[i]=(bb&(a>>i)).count()&1;//存在多少个(a-i)%b=0        if(b[i]){//枚举b[i]倍数            for(int j=0;j<N;j+=i){                bb.flip(j);            }        }    }}int main(){    //freopen("/home/lu/code/r.txt","r",stdin);    //freopen("/home/lu/code/w.txt","w",stdout);    int T;    scanf("%d",&T);    while(T--){        int n,m,q;        scanf("%d%d%d",&n,&m,&q);        a.reset();        b.reset();        int maxK=0;        for(int i=0;i<n;++i){            int x;            scanf("%d",&x);            a.set(x);        }        for(int i=0;i<m;++i){            int x;            scanf("%d",&x);            b.set(x);            maxK=max(maxK,x);        }        slove(maxK);        while(q--){            int x;            scanf("%d",&x);            puts(ans[x]?"1":"0");        }    }    return 0;}
原创粉丝点击