代码中int->longlong, ll->__int128
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#define int long long
#define up(i, a, b) for (int i = a; i <= b; i++)
#define dn(i, a, b) for (int i = a; i >= b; i--)
using namespace std;
typedef __int128 ll;
int read() {
int x = 0, f = 1; char ch = getchar();
while (ch < '0' || ch > '9') {if (ch == '-') f = -1;ch = getchar();}
while (ch >= '0' && ch <= '9') {x = (x << 1) + (x << 3) + (ch ^ 48);ch = getchar();}
return x * f;
}
const int N = 1e5 + 5;
int n, m, A[N], atk[N], p[N], B[N], mi, gcd;
void exgcd(int a, int b, int &x, int &y) {
if (!b) x = 1, y = 0, gcd = a;
else exgcd(b, a % b, y, x), y -= a / b * x;
}
int excrt() {
int mul = p[1], ans = A[1], x, y, bg;
up(i, 2, n) {
int a = (ll)B[i] * mul % p[i];
int b = p[i];
int c = (A[i] - B[i] * ans % p[i] + p[i]) % p[i];
exgcd(a, b, x, y);
if (c % gcd) return -1;
bg = b / gcd;
x = (ll)x % bg * (c / gcd) % bg;
ans += mul * x;
mul *= bg;
ans = (ans % mul + mul) % mul;
}
if (ans < mi) ans += ((mi - ans - 1) / mul + 1) * mul;
return ans;
}
signed main() {
int T = read();
while (T--) {
mi = 0;
multiset <int> s;
n = read(), m = read();
up(i, 1, n) A[i] = read();
up(i, 1, n) p[i] = read();
up(i, 1, n) atk[i] = read();
up(i, 1, m) s.insert(read());
up(i, 1, n) {
auto pt = s.upper_bound(A[i]);
if (pt != s.begin()) pt--;
B[i] = *pt;
s.erase(pt);
s.insert(atk[i]);
mi = max(mi, (A[i] - 1) / B[i] + 1);
}
printf("%lld\n", excrt());
}
return 0;
}
重打了一遍还是30分