#include<bits/stdc++.h> #include<stdio.h> #include<algorithm> #include<queue> #include<string.h> #include<iostream> #include<math.h> #include<set> #include<map> #include<vector> #include<iomanip> using namespace std; #define ll long long #define pb push_back #define FOR(a) for(int i=1;i<=a;i++) const int inf=0x3f3f3f3f; const int maxn=5e4+9; const int mod=998244353; bitset<maxn>a,b,ans,bx;//ans[x]:模后为x的出现次数 void solve(int x){ //取余不会超过最大值x bx.reset(); for(int i=x;i>=0;i--){ //(a-i)%b==0 ans[i]=((a>>i) & bx).count() & 1;//a>>i就是(a-i)的出现状况了 if(!b[i])continue; for(int j=0;j<maxn;j+=i){ bx.flip(j);//b[x]:b中元素倍数的出现次数 //对于当前枚举的余数,只有更大的b的倍数才会生成 //所以倒序枚举因子倍数 } } } int main(){ int T;scanf("%d",&T); while(T--){ a.reset();b.reset(); int n,m,q,x,maxt=0; scanf("%d%d%d",&n,&m,&q); for(int i=1;i<=n;i++){ scanf("%d",&x);a.set(x); } for(int i=1;i<=m;i++){ scanf("%d",&x); b.set(x); maxt=max(x,maxt); } ans.reset(); solve(maxt); while(q--){ scanf("%d",&x); if(ans[x])puts("1"); else puts("0"); } } }主要的思路都在注释里了