#include <bits/stdc++.h>
#include <ext/rope>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("unroll-loops")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#define int long long
#define pb push_back
#define x first
#define y second
#define mk(a,b) make_pair(a,b)
#define rr return 0
#define sqr(a) ((a)*(a))
#define all(a) (a).begin(), (a).end()
#define sz(a) (int)(a).size()
#define name(a) #a
using namespace std;
using namespace __gnu_cxx;
using namespace __gnu_pbds;
using ll = long long;
using ld = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
template<class value, class cmp = less<value> >
using ordered_set = tree<value, null_type, cmp, rb_tree_tag, tree_order_statistics_node_update>;
template<class value, class cmp = less_equal<value> >
using ordered_multiset = tree<value, null_type, cmp, rb_tree_tag, tree_order_statistics_node_update>;
template<class key, class value, class cmp = less<key> >
using ordered_map = tree<key, value, cmp, rb_tree_tag, tree_order_statistics_node_update>;
/// find_by_order()
/// order_of_key()
mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
inline int randll(int l = INT_MIN, int r = INT_MAX) {
return uniform_int_distribution<int>(l, r)(rng);
}
const int INF = 1e9, MOD = 1e9 + 7; /// think
const ll LINF = 1e18;
const int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};
inline bool inside (int x, int y, int n, int m) {
return 0 <= x && 0 <= y && x < n && y < m;
}
template<class T> bool umin (T &a, T b) {return a > b ? (a = b, true) : false; }
template<class T> bool umax (T &a, T b) {return a < b ? (a = b, true) : false; }
const int M = 20;
const int N = 1 << M;
bitset<N> used;
inline void dfs (int v, vector <int> &a, vector <int> &b) {
used[v] = 1;
for (int i : a) {
int to = v | i;
if (!used[to]) {
dfs(to, a, b);
}
}
for (int i : b) {
int to = v & i;
if (!used[to]) {
dfs(to, a, b);
}
}
}
inline int stupid(int n, int m, vector <int> a, vector <int> b) {
used.reset();
dfs(0, a, b);
// cout << used.count() << '\n';
return used.count();
}
inline void solve1 () {
int n, m;
cin >> n >> m;
vector <int> a(n), b(m);
for (auto &i : a) cin >> i;
for (auto &i : b) cin >> i;
sort(all(a));
sort(all(b));
reverse(all(b));
vector <int> A;
vector <int> c(N);
while (true) {
bool ok = true;
for (auto &i : a) {
if (c[i] != i) {
A.pb(i);
c[i] |= i;
for (int mask = i; mask < N; mask = i | (mask + 1)) {
c[mask] |= i;
}
ok = false;
break;
}
}
if (ok) break;
}
vector <int> B;
vector <int> d(N, N - 1);
while (true) {
bool ok = true;
for (auto &i : b) {
if (d[i] != i) {
B.pb(i);
d[i] &= i;
for (int mask = i; mask > 0; mask = i & (mask - 1)) {
d[mask] &= i;
}
ok = false;
break;
}
}
if (ok) break;
}
int ans = stupid(sz(A), sz(B), A, B);
cout << ans << '\n';
}
main()
{
ios::sync_with_stdio(0);
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while (t--) {
solve1();
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDxleHQvcm9wZT4KI2luY2x1ZGUgPGV4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwPgojaW5jbHVkZSA8ZXh0L3BiX2RzL3RyZWVfcG9saWN5LmhwcD4KLy8jcHJhZ21hIEdDQyBvcHRpbWl6ZSgiT2Zhc3QiKQovLyNwcmFnbWEgR0NDIG9wdGltaXplKCJ1bnJvbGwtbG9vcHMiKQovLyNwcmFnbWEgR0NDIHRhcmdldCgic3NlLHNzZTIsc3NlMyxzc3NlMyxzc2U0LHBvcGNudCxhYm0sbW14LGF2eCx0dW5lPW5hdGl2ZSIpCi8vI2RlZmluZSBpbnQgbG9uZyBsb25nCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgeCBmaXJzdAojZGVmaW5lIHkgc2Vjb25kCiNkZWZpbmUgbWsoYSxiKSBtYWtlX3BhaXIoYSxiKQojZGVmaW5lIHJyIHJldHVybiAwCiNkZWZpbmUgc3FyKGEpICgoYSkqKGEpKQojZGVmaW5lIGFsbChhKSAoYSkuYmVnaW4oKSwgKGEpLmVuZCgpCiNkZWZpbmUgc3ooYSkgKGludCkoYSkuc2l6ZSgpCiNkZWZpbmUgbmFtZShhKSAjYQoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdXNpbmcgbmFtZXNwYWNlIF9fZ251X2N4eDsKdXNpbmcgbmFtZXNwYWNlIF9fZ251X3BiZHM7Cgp1c2luZyBsbCA9IGxvbmcgbG9uZzsKdXNpbmcgbGQgPSBsb25nIGRvdWJsZTsKdXNpbmcgcGlpID0gcGFpcjxpbnQsIGludD47CnVzaW5nIHBsbCA9IHBhaXI8bGwsIGxsPjsKCnRlbXBsYXRlPGNsYXNzIHZhbHVlLCBjbGFzcyBjbXAgPSBsZXNzPHZhbHVlPiA+CnVzaW5nIG9yZGVyZWRfc2V0ID0gdHJlZTx2YWx1ZSwgbnVsbF90eXBlLCBjbXAsIHJiX3RyZWVfdGFnLCB0cmVlX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGU+Owp0ZW1wbGF0ZTxjbGFzcyB2YWx1ZSwgY2xhc3MgY21wID0gbGVzc19lcXVhbDx2YWx1ZT4gPgp1c2luZyBvcmRlcmVkX211bHRpc2V0ID0gdHJlZTx2YWx1ZSwgbnVsbF90eXBlLCBjbXAsIHJiX3RyZWVfdGFnLCB0cmVlX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGU+Owp0ZW1wbGF0ZTxjbGFzcyBrZXksIGNsYXNzIHZhbHVlLCBjbGFzcyBjbXAgPSBsZXNzPGtleT4gPgp1c2luZyBvcmRlcmVkX21hcCA9IHRyZWU8a2V5LCB2YWx1ZSwgY21wLCByYl90cmVlX3RhZywgdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlPjsKCi8vLyBmaW5kX2J5X29yZGVyKCkKLy8vIG9yZGVyX29mX2tleSgpCm10MTk5Mzcgcm5nKGNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKS50aW1lX3NpbmNlX2Vwb2NoKCkuY291bnQoKSk7CmlubGluZSBpbnQgcmFuZGxsKGludCBsID0gSU5UX01JTiwgaW50IHIgPSBJTlRfTUFYKSB7CiAgICByZXR1cm4gdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPGludD4obCwgcikocm5nKTsKfQoKY29uc3QgaW50IElORiA9IDFlOSwgTU9EID0gMWU5ICsgNzsgLy8vIHRoaW5rCmNvbnN0IGxsIExJTkYgPSAxZTE4OwoKY29uc3QgaW50IGR4W10gPSB7MCwgMCwgMSwgLTF9LCBkeVtdID0gezEsIC0xLCAwLCAwfTsKaW5saW5lIGJvb2wgaW5zaWRlIChpbnQgeCwgaW50IHksIGludCBuLCBpbnQgbSkgewogICAgcmV0dXJuIDAgPD0geCAmJiAwIDw9IHkgJiYgeCA8IG4gJiYgeSA8IG07Cn0KCnRlbXBsYXRlPGNsYXNzIFQ+IGJvb2wgdW1pbiAoVCAmYSwgVCBiKSB7cmV0dXJuIGEgPiBiID8gKGEgPSBiLCB0cnVlKSA6IGZhbHNlOyB9CnRlbXBsYXRlPGNsYXNzIFQ+IGJvb2wgdW1heCAoVCAmYSwgVCBiKSB7cmV0dXJuIGEgPCBiID8gKGEgPSBiLCB0cnVlKSA6IGZhbHNlOyB9Cgpjb25zdCBpbnQgTSA9IDIwOwpjb25zdCBpbnQgTiA9IDEgPDwgTTsKCgoKYml0c2V0PE4+IHVzZWQ7CmlubGluZSB2b2lkIGRmcyAoaW50IHYsIHZlY3RvciA8aW50PiAmYSwgdmVjdG9yIDxpbnQ+ICZiKSB7CiAgICB1c2VkW3ZdID0gMTsKICAgIGZvciAoaW50IGkgOiBhKSB7CiAgICAgICAgaW50IHRvID0gdiB8IGk7CiAgICAgICAgaWYgKCF1c2VkW3RvXSkgewogICAgICAgICAgICBkZnModG8sIGEsIGIpOwogICAgICAgIH0KICAgIH0KICAgIGZvciAoaW50IGkgOiBiKSB7CiAgICAgICAgaW50IHRvID0gdiAmIGk7CiAgICAgICAgaWYgKCF1c2VkW3RvXSkgewogICAgICAgICAgICBkZnModG8sIGEsIGIpOwogICAgICAgIH0KICAgIH0KfQppbmxpbmUgaW50IHN0dXBpZChpbnQgbiwgaW50IG0sIHZlY3RvciA8aW50PiBhLCB2ZWN0b3IgPGludD4gYikgewogICAgdXNlZC5yZXNldCgpOwogICAgZGZzKDAsIGEsIGIpOwovLyAgICBjb3V0IDw8IHVzZWQuY291bnQoKSA8PCAnXG4nOwogICAgcmV0dXJuIHVzZWQuY291bnQoKTsKfQoKCmlubGluZSB2b2lkIHNvbHZlMSAoKSB7CiAgICBpbnQgbiwgbTsKICAgIGNpbiA+PiBuID4+IG07CiAgICB2ZWN0b3IgPGludD4gYShuKSwgYihtKTsKICAgIGZvciAoYXV0byAmaSA6IGEpIGNpbiA+PiBpOwogICAgZm9yIChhdXRvICZpIDogYikgY2luID4+IGk7CiAgICBzb3J0KGFsbChhKSk7CiAgICBzb3J0KGFsbChiKSk7CiAgICByZXZlcnNlKGFsbChiKSk7CgogICAgdmVjdG9yIDxpbnQ+IEE7CiAgICB2ZWN0b3IgPGludD4gYyhOKTsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgYm9vbCBvayA9IHRydWU7CiAgICAgICAgZm9yIChhdXRvICZpIDogYSkgewogICAgICAgICAgICBpZiAoY1tpXSAhPSBpKSB7CiAgICAgICAgICAgICAgICBBLnBiKGkpOwogICAgICAgICAgICAgICAgY1tpXSB8PSBpOwogICAgICAgICAgICAgICAgZm9yIChpbnQgbWFzayA9IGk7IG1hc2sgPCBOOyBtYXNrID0gaSB8IChtYXNrICsgMSkpIHsKICAgICAgICAgICAgICAgICAgICBjW21hc2tdIHw9IGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBvayA9IGZhbHNlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKG9rKSBicmVhazsKICAgIH0KCiAgICB2ZWN0b3IgPGludD4gQjsKICAgIHZlY3RvciA8aW50PiBkKE4sIE4gLSAxKTsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgYm9vbCBvayA9IHRydWU7CiAgICAgICAgZm9yIChhdXRvICZpIDogYikgewogICAgICAgICAgICBpZiAoZFtpXSAhPSBpKSB7CiAgICAgICAgICAgICAgICBCLnBiKGkpOwogICAgICAgICAgICAgICAgZFtpXSAmPSBpOwogICAgICAgICAgICAgICAgZm9yIChpbnQgbWFzayA9IGk7IG1hc2sgPiAwOyBtYXNrID0gaSAmIChtYXNrIC0gMSkpIHsKICAgICAgICAgICAgICAgICAgICBkW21hc2tdICY9IGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBvayA9IGZhbHNlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKG9rKSBicmVhazsKICAgIH0KICAgIGludCBhbnMgPSBzdHVwaWQoc3ooQSksIHN6KEIpLCBBLCBCKTsKICAgIGNvdXQgPDwgYW5zIDw8ICdcbic7Cn0KCm1haW4oKQp7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbygwKTsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7CiAgICBjaW4udGllKDApOwogICAgY291dC50aWUoMCk7CiAgICBpbnQgdDsKICAgIGNpbiA+PiB0OwogICAgd2hpbGUgKHQtLSkgewogICAgICAgIHNvbHZlMSgpOwogICAgfQp9Cg==