Description
给出两个序列
A1,...,n
和
B1,...,m
,给出
q
次查询,每次查询给出一整数
Input
第一行一整数
T
表示用例组数,每组用例首先输入三个整数
(1≤T≤5,1≤n,m,q≤50000,1≤Ai,Bi≤50000,0≤k<max Bi,Ai≠Aj,Bi≠Bj,i≠j)
Output
对于每组查询,输出满足 Ai≡k mod Bj 的 (i,j) 对数,结果模 2
Sample Input
1
5 5 5
1 2 3 4 5
1 2 3 4 5
0 1 2 3 4
Sample Output
0
0
0
0
1
Solution
Code
#include<cstdio>
#include<bitset>
#include<cstring>
using namespace std;
namespace fastIO
{
#define BUF_SIZE 100000
//fread -> read
bool IOerror=0;
inline char nc()
{
static char buf[BUF_SIZE],*p1=buf+BUF_SIZE,*pend=buf+BUF_SIZE;
if(p1==pend)
{
p1=buf;
pend=buf+fread(buf,1,BUF_SIZE,stdin);
if(pend==p1)
{
IOerror=1;
return -1;
}
}
return *p1++;
}
inline bool blank(char ch)
{
return ch==' '||ch=='\n'||ch=='\r'||ch=='\t';
}
inline void read(int &x)
{
char ch;
while(blank(ch=nc()));
if(IOerror)return;
for(x=ch-'0';(ch=nc())>='0'&&ch<='9';x=x*10+ch-'0');
}
inline void readc(char &x)
{
char ch;
while(blank(ch=nc()));
if(IOerror)return;
x=ch;
}
#undef BUF_SIZE
};
using namespace fastIO;
#define maxn 50005
bitset<maxn>A,B;
int T,n,m,q,b[maxn],ans[maxn];
int main()
{
read(T);
//scanf("%d",&T);
while(T--)
{
read(n),read(m),read(q);
//scanf("%d%d%d",&n,&m,&q);
A.reset(),B.reset();
for(int i=1;i<=n;i++)
{
int a;
read(a);
//scanf("%d",&a);
A.set(a);
}
memset(b,0,sizeof(b));
int M=0;
for(int i=1;i<=m;i++)
{
int a;
read(a);
//scanf("%d",&a);
b[a]=1;M=max(M,a);
}
for(int i=0;i<=M;i++)ans[i]=0;
for(int i=M;i>=0;i--)
{
ans[i]=((B<<i)&A).count()&1;
if(b[i])
for(int k=0;k<=M;k+=i)B.flip(k);
}
while(q--)
{
int k;
read(k);
//scanf("%d",&k);
printf("%d\n",ans[k]);
}
}
return 0;
}