题意:
题目的意思是存在两个长度分别为 n,m 的数组 A,B 。有 q 个询问,每个询问给出一个数字 k ,可以得到使得 Ai mod Bj =k 的种数。求该种数mod 2。
思路:
如果a%b==k的话, b肯定大于k,所以从最大的b开始枚举。其中bitset-bb中记录的就是大于k的bj的倍数。a%b=k 就是a-b*j=k,就是a-k=b*j。那么bb & (a >> i)可以得到(a - i) % b = 0的数了,注意bitset右移i位就相当于所有的元素减少了i, 这样就可以得到每一个余数的答案了。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <cmath>
#include <bitset>
using namespace std;
bitset<50005>a, b, bb, ans;
void solve(int maxk)
{
bb.reset();
ans.reset();
for(int i = maxk; i >= 0; --i)
{
ans[i] = (bb & (a >> i)).count() & 1;///二进制中1的个数
if(b[i])
{
for(int j = 0; j <= 50000; j += i)
bb.flip(j);///j处取反
}
}
return;
}
int main()
{
int CASE;
scanf("%d", &CASE);
while(CASE--)
{
a.reset();
b.reset();
int n, m, q;
scanf("%d%d%d", &n, &m, &q);
int x;
int maxx = 0;
while(n--)
{
scanf("%d", &x);
a.set(x);///x处置1
}
while(m--)
{
scanf("%d", &x);
b.set(x);
maxx = max(maxx, x);
}
solve(maxx);
while(q--)
{
scanf("%d", &x);
printf("%d\n", ans[x]&1);
}
}
return 0;
}