这份代码只要不输出 −1, 其他的结果都是对的……不知道为什么错了,求大佬帮忙看看判断无解的部分 /kel
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
int s=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch)){s=s*10+ch-'0';ch=getchar();}
return s;
}
const int N=2e5+10;
inline void write(int x){
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
}
int T,a[N],p[N],v[N];
multiset<int>s;
int n,m,val[N];
void clear(){
s.clear();
for(int i=1;i<=n;++i)val[i]=p[i]=a[i]=v[i]=0;
}
inline int gcd(int x,int y){return !y?x:gcd(y,x%y);}
inline int lcm(int x,int y){return x/gcd(x,y)*y;}
inline int Add(int x,int y,int mod){return (x%mod+y%mod)%mod;}
inline int Min(int x,int y){return x<y?x:y;}
inline int Max(int x,int y){return x<y?y:x;}
inline int QMul(int x,int y,int mod){
if(y<0) x=-x,y=-y;
int res=0;
while(y){
if(y&1)res=Add(res,x,mod);
x=Add(x,x,mod);y>>=1;
}
return res;
}
void Exgcd(int a,int b,int &x,int &y){
if(!b){x=1;y=0;return;}
Exgcd(b,a%b,x,y);
int t=x;x=y;y=t-a/b*y;
}
void PreTreat(){
for(int i=1;i<=n;++i){
set<int>::iterator it=s.upper_bound(a[i]);
--it;val[i]=*it;
s.erase(it);s.insert(v[i]);
}
}
int ExCRT(){
int M=p[1];
int root,yy;
Exgcd(val[1],p[1],root,yy);
root%=p[1];root+=p[1];root%=p[1];
int G=gcd(val[1],p[1]);
if(a[1]%G!=0)return -1;
root=QMul(root,a[1]/G,p[1]/G);
for(int i=2;i<=n;++i){
int coe=QMul(val[i],M,p[i]);
int qm=QMul(val[i],root,p[i]);
int os=a[i]-qm;
// assert(os>=0);
int d=gcd(coe,p[i]);
if(os%d!=0)return -1;
int t,y;
Exgcd(coe,p[i],t,y);
t=QMul(t,os/d,p[i]/d);
int nxt_m=lcm(M,p[i]);
root=Add(root,QMul(t,M,nxt_m),nxt_m);
M=nxt_m;root%=M;root+=M;root%=M;
}
root%=M;root+=M;root%=M;
int times=0;
for(int i=1;i<=n;++i){
if(a[i]/val[i]>root){
int cost=root*val[i];
int c=a[i]-cost;
if(c/M<=val[i]){
times=Max(times,1);
continue;
}
int unitval=M*val[i];
int t=0;
if(c%unitval==0)t=c/unitval;
else t=c/unitval+1;
times=Max(times,t);
}
}
root=root+times*M;
return root;
}
signed main(){
freopen("dragon2.in","r",stdin);
T=read();
while(T--){
clear();
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)v[i]=read();
for(int i=1;i<=m;++i){
int x=read();
s.insert(x);
}
PreTreat();
int ans=ExCRT();
write(ans);putchar('\n');
}
return 0;
}