#include<bits/stdc++.h>
using namespace std;
multiset<__int128>sword;
const int N=1e5+10;
long long a[N],p[N],h[N],b[N];
__int128 exgcd(__int128 a,__int128 b,__int128 &x,__int128 &y){
if(!b){
x=1,y=0;
return a;
}
__int128 x1,y1,d;
d=exgcd(b,a%b,x1,y1);
x=y1;
y=x1-a/b*y1;
return d;
}
int main(){
//freopen("P4774_1.in","r",stdin);
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int T;
cin>>T;
while(T--){
int n1,m1;
cin>>n1>>m1;
for(int i=1;i<=n1;i++) cin>>a[i];
for(int i=1;i<=n1;i++) cin>>p[i];
for(int i=1;i<=n1;i++) cin>>h[i];
sword.clear();
for(int i=1;i<=m1;i++){
int x;
cin>>x;
sword.insert(x);
}
__int128 smallest=0;
for(int i=1;i<=n1;i++){
auto v=upper_bound(sword.begin(),sword.end(),a[i]);
if(v!=sword.begin()) v--;
b[i]=*v;
sword.erase(v);
sword.insert(h[i]);
smallest=max(smallest,(__int128)ceil(a[i]/b[i]));
}
__int128 m,n,ddd;
ddd=exgcd(b[1],p[1],m,n);
__int128 ansa,ansb;
if(a[1]%ddd){
puts("-1");
continue;
}
ansb=p[1]/ddd;
ansa=m*(a[1]/ddd);
ansa=(ansa%ansb+ansb)%ansb;
bool ok=true;
for(int i=2;i<=n1;i++){
ddd=exgcd(ansb*b[i],p[i],m,n);
if((a[i]-ansa*b[i])%ddd){
puts("-1");
ok=false;
break;
}
m=m*((a[i]-ansa*b[i])/ddd);
__int128 dx=p[i]/ddd;
m=(m%dx+dx)%dx;
ansa=m*ansb+ansa;
ansb=ansb/__gcd(ansb,(__int128)p[i])*p[i];
}
if(!ok) continue;
//while(ansa<smallest) ansa+=ansb;
__int128 sss=(__int128)ceil((smallest-ansa)*1.0/ansb);
ansa+=sss*ansb;
cout<<(long long)ansa<<endl;
}
return 0;
}
为什么这一题14~20个点超时,3~7个点WA 是不是multiset太慢了