rt,本机样例能过,luoguWA40pts,LOJ-O2样例TLE。
#include<bits/stdc++.h>
#define db double
#define int long long
using namespace std;
inline int read() {
int x = 0; bool op = false;
char c = getchar();
while(!isdigit(c))op |= (c == '-'), c = getchar();
while(isdigit(c))x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
return op ? -x : x;
}
const int N = 100010;
int n, m;
int p[N], a[N], b[N], add[N];
int gcd(int a, int b) {return b ? gcd(b, a % b) : a;}
int exgcd(int a, int b, int &x, int &y) {
if(b == 0) {x = 1; y = 0; return a;}
int res = exgcd(b, a % b, y, x); y -= (a / b) * x;
return res;
}
int sol(int a, int b, int c) {
int x, y;
int g = exgcd(a, b, x, y);
if(c % g)return -1;
return (x * (c / g) % (b / g) + (b / g)) % (b / g);
}
signed main() {
int test = read();
while(test--) {
multiset<int> s;
n = read(); m = read();
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++)add[i] = read();
for(int i = 1; i <= m; i++) {
int x = read(); s.insert(x);
}
bool flg = false;
for(int i = 1; i <= m; i++) {
multiset<int>::iterator it = s.upper_bound(a[i]);
if(it != s.begin())--it;
int atk = *it; s.erase(it); s.insert(add[i]);
int tmp = sol(atk, p[i], a[i]);
if(tmp == -1)flg = true; else b[i] = tmp;
}
if(flg) {puts("-1"); continue;}
int M = p[1], ans = b[1];
for(int i = 2; i <= n; i++) {
int k = sol(M, p[i], b[i] - ans), tmp = M;
if(k == -1)flg = true;
M = M / gcd(M, p[i]) * p[i]; ans = (ans + (tmp * k) % M) % M;
}
if(flg) {puts("-1"); continue;}
printf("%lld\n", ans);
}
return 0;
}