1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
| #include<iostream> #include<cstdio> #include<algorithm> #include<cstdlib> #include<cstring> #include<string> #include<set> #include<map> #include<cmath> using namespace std; const long long inf=0x7fffffff; const double eps=1e-10; const double pi=acos(-1.0); const int N=1e5+10; inline long long read(){ long long x=0,f=1;char ch;ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } long long n,m,T; long long f[N],p[N],a[N],w[N],x[N]; long long gcd(long long a,long long b) {return b?gcd(b,a%b):a;} long long exgcd(long long a,long long b,long long &x,long long &y){ if(!b){x=1,y=0;return a;} long long res=exgcd(b,a%b,y,x); y-=x*(a/b); return res; } long long inv(long long a,long long b){ long long x=0,y=0,g=exgcd(a,b,x,y); if(g>1)return -1; return (x+b)%b; } long long fast_multi(long long a,long long b,long long p) { a=(a%p+p)%p; b=(b%p+p)%p; long long ans=0; for(;a;a>>=1,b=(b<<1)%p) if(a&1LL)ans=(ans+b)%p; return ans; } bool CRT(long long w1,long long p1,long long w2,long long p2,long long &w,long long &p){ long long x,y,z=w2-w1,g=exgcd(p1,p2,x,y); if(z%g)return 0; long long t=z/g; x=fast_multi(x,t,p2/g); p=p1/g*p2; w=((w1+fast_multi(x,p1,p))%p+p)%p; return 1; } long long solve(){ for(int i=1;i<=n;i++){ long long g=gcd(a[i],gcd(f[i],p[i])); f[i]/=g,p[i]/=g,a[i]/=g; long long Inv=inv(f[i],p[i]); if(Inv<0)return -1LL; x[i]=fast_multi(a[i],Inv,p[i]); } long long W=x[1],P=p[1]; for(int i=2;i<=n;i++) if(!CRT(W,P,x[i],p[i],W,P))return -1LL; for(int i=1;i<=n;i++){ long long val=(a[i]+f[i]-1)/f[i]; if(val<=W)continue; long long k=(val-W+P-1)/P; W+=k*P; } return W; } multiset<long long> S; int main() {
T=read(); while(T--){ 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++)w[i]=read(); S.clear(); while(m--)S.insert(read()); for(int i=1;i<=n;i++){ multiset<long long> :: iterator p=S.begin(); if((*p)<a[i])p=--S.upper_bound(a[i]); f[i]=*p,S.erase(p); S.insert(w[i]); } printf("%lld\n",solve()); } fclose(stdin); fclose(stdout); return 0; }
|