inlineintread(){ int x = 0, f = 1; char c = getchar(); while (!isdigit(c)) { if (c == '-')f = -1; c = getchar(); } while (isdigit(c)) { x = (x << 3) + (x << 1) + (c ^ 48); c = getchar(); } return x * f; }
multiset<int> Sw; int N, M; int A[maxN]; int P[maxN]; int S[maxN]; int T[maxN];
inlinevoidinput(){ Sw.clear();
scanf("%lld%lld", &N, &M); for (int i = 1; i <= N; i++) A[i] = read(); for (int i = 1; i <= N; i++) P[i] = read(); for (int i = 1; i <= N; i++) T[i] = read(); for (int i = 1; i <= M; i++) { int t = read(); Sw.insert(t); } for (int i = 1; i <= N; i++) { auto p = Sw.upper_bound(A[i]); p--; if (p == Sw.begin()) { p = Sw.lower_bound(0); S[i] = *p; Sw.erase(p); } else { S[i] = *p; Sw.erase(p++); } Sw.insert(T[i]); } // for(int i = 1;i<=N;i++) printf("%d ",S[i]); // printf("\n"); }
inlinevoidexgcd(int a, int b, int &g, int &x, int &y){ if (b == 0) g = a, x = 1, y = 0; else { exgcd(b, a % b, g, x, y); int t = x; x = y; y = t - (a / b) * y; } }
int ma = -1;
intexCRT(){ int ans = 0, lcm = 1; int x, y, g, ATK, B, C; for (int i = 1; i <= N; i++) { ATK = (__int128)S[i] * lcm % P[i]; B = P[i]; C = (A[i] - S[i] * ans % P[i] + P[i]) % P[i]; exgcd(ATK, B, g, x, y); x = (x % B + B) % B; if (C % g) return-1; ans += (__int128)(C / g) * x % (B / g) * lcm % (lcm *= (B / g)); ans %= lcm; } if (ans < ma) ans += ((ma - ans - 1) / lcm + 1) / lcm; return ans; } inlineboolTP1(){ for (int i = 1; i <= N; i++) if (P[i] != 1) returnfalse; returntrue; }
inlineintquickPow(int a, int b, int p){ int ans = 1; while (b) { if (b & 1) ans = ans * a % p; a = a * a % p; b >>= 1; } return ans; }
inlineintCRT(){ int M = 1; for (int i = 1; i <= N; i++) { M *= P[i]; } int ans = 0; for (int i = 1; i <= N; i++) { int M1 = quickPow(M, P[i] - 2, P[i]); ans = (ans + A[i] * M * M1) % P[i]; } return0; // return ans * ; }
inlinevoidsolve(){ input(); ma = -1; for (int i = 1; i <= N; i++) { ma = max(ma, (int)(ceil(1.0 * A[i] / S[i]))); } if(TP1()){ printf("%lld\n",ma); return; } printf("%lld\n", exCRT()); } signedmain(){ int T; scanf("%lld", &T); while (T--) { solve(); } return0; }
inlineinttoInt(char c){ returnisdigit(c) ? c - '0' : c - 'A' + 10; }
inlineintread(){ char c = getchar(); while (!isdigit(c)) { if (c >= 'A' && c <= 'Z') return c - 'A' + 10; c = getchar(); } while (isdigit(c)) return c - '0'; }
inlinevoidprintInBin(int x, char endline = '\n'){ for (int i = 15; i >= 0; i--) { putchar((x & (1 << i)) ? '1' : '0'); } if (endline) putchar(endline); }
intpopcount(int x){
int cnt = 0; for (int i = 0; i < 16; i++) { cnt = cnt + (((1 << i) & x) ? 1 : 0); }
return cnt; }
int a, b, c, d; intmain(){ // getM(); scanf("%d%d%llu%llu", &N, &Q, &a1, &a2); gen(N, a1, a2); // for(int i = 0;i<16;i++){ // for(int j = 0;j<(1<<16);j++){ // V[i][j].resize(32); // } // } int p = 0; for (registerint i = 1; i <= N; i++) { p = 0;
for (int j = 0; j < 16; j++) { for (int k = 15; k >= 0; k--) { M[i][j] |= s[i][p++] ? (1 << k) : 0; } V[j][M[i][j]].push_back(i); }
}
while (Q--) {
for (int i = 0; i < 16; i += 8) {
T[i] = 0; a = read(); b = read(); c = read(); d = read(); T[i] = (a << 12) + (b << 8) + (c << 4) + d; if (lastans)T[i] = ~(T[i] | (~((1 << 16) - 1)));
T[i + 1] = 0; a = read(); b = read(); c = read(); d = read(); T[i + 1] = (a << 12) + (b << 8) + (c << 4) + d; if (lastans)T[i + 1] = ~(T[i + 1] | (~((1 << 16) - 1)));
T[i + 2] = 0; a = read(); b = read(); c = read(); d = read(); T[i + 2] = (a << 12) + (b << 8) + (c << 4) + d; if (lastans)T[i + 2] = ~(T[i + 2] | (~((1 << 16) - 1)));
T[i + 3] = 0; a = read(); b = read(); c = read(); d = read(); T[i + 3] = (a << 12) + (b << 8) + (c << 4) + d; if (lastans)T[i + 3] = ~(T[i + 3] | (~((1 << 16) - 1))); T[i + 4] = 0; a = read(); b = read(); c = read(); d = read(); T[i + 4] = (a << 12) + (b << 8) + (c << 4) + d; if (lastans)T[i + 4] = ~(T[i + 4] | (~((1 << 16) - 1))); T[i + 5] = 0; a = read(); b = read(); c = read(); d = read(); T[i + 5] = (a << 12) + (b << 8) + (c << 4) + d; if (lastans)T[i + 5] = ~(T[i + 5] | (~((1 << 16) - 1))); T[i + 6] = 0; a = read(); b = read(); c = read(); d = read(); T[i + 6] = (a << 12) + (b << 8) + (c << 4) + d; if (lastans)T[i + 6] = ~(T[i + 6] | (~((1 << 16) - 1))); T[i + 7] = 0; a = read(); b = read(); c = read(); d = read(); T[i + 7] = (a << 12) + (b << 8) + (c << 4) + d; if (lastans)T[i + 7] = ~(T[i + 7] | (~((1 << 16) - 1))); }
int k; scanf("%d", &k); bool flg = false; // for (int i = 0; i < 16; i++) { // if (V[i][T[i]].size()) { // AT = i; // siz = V[i][T[i]].size(); // break; // } // } // if(AT == -1) goto awa;
for (int i = 0; i < 15; i++) { for (int t : V[i][T[i]]) { int cnt = 0; for (registerint j = 0; j < 16; j++) { cnt += __builtin_popcount(M[t][j] ^ T[j]); if(cnt > k) break; }