考虑枚举k,此时只有bj>k,ai>=k,才可能满足ai%bj=k
bbi={i的>k的因子属于b[1...m]的个数}
此时余数为k的情况数=∑ni=1bbai−k
考虑用bitset存放a,bitsetA>>k等价于a数组全部元素减去k,丢弃<0的元素
bitsetBB[i]=bbi
&
1
ans[k]=(bitsetA>>k)
&
bitsetBB.count()
&
1
求解bb,对每个bi,枚举其倍数,O(N∑1bi)
最坏情况下变为N∗调和级数=O(N∑Ni=11N)约等于O(N∗ln(N+1))
枚举k,对bitsetA和bitsetBB进行and操作O(N232)
所以复杂度大概O(N232+N∗ln(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]==0
void 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;
}