#include <bits/stdc++.h>
#define __int128 long long
#define SI static inline
#define getchar() (p1==p2&&(p2=(p1=buffer)+fread(buffer,1,1<<21,stdin),p1==p2)?EOF:*p1++)
using namespace std;
char buffer[1<<21],*p1,*p2;
SI int read(){int x=0;bool f=1;char ch=getchar();while(ch<48||ch>57){if(ch==45)f=0;ch=getchar();}while(ch>=48&&ch<=57){x=x*10+(ch^48);ch=getchar();}return f?x:-x;}
SI void write(int x){if(x<0){putchar(45);write(-x);return;}if(x>9)write(x/10);putchar(x%10^48);}
SI void writeln(int x){write(x),puts("");}
SI int gcd(int a,int b){return !b?a:gcd(b,a%b);}
SI int exgcd(int a,int b,int&x,int&y){if(!b){x=1,y=0;return a;}int tmp=exgcd(b,a%b,y,x);y-=a/b*x;return tmp;}
SI int qp(int a,int b,int p=1e9+7){int ret=1;for(;b;b>>=1,(a*=a)%=p)if(b&1)(ret*=a)%=p;return ret;}
#define lowbit(x) x&-x
SI void solve();
#define MULT
signed main(){int T=1;
#ifdef MULT
T=read();
#endif
while(T--)solve();}
/*----free--*/
const int N=100005;
int n,m,mx,a[N],b[N],p[N],reward[N];
multiset<int>s;
SI int exCRT(){
// b[i]*x = a[i] (mod p[i])
int A,B,C,M=1;
int ans=0; // 前 i-1 条的解
for(int i=1;i<=n;i++){
// 现在考虑将前 i-1 条和第 i 条合并
// b[i]*(ans+Mx) = a[i] (mod p[i])
// (b[i]M)x + (p[i])y = (a[i]-b[i]*ans)
A=b[i]*M%p[i];
B=p[i];
C=(a[i]-b[i]*ans%p[i]+p[i])%p[i];
// ax+by=(a,b)
int x,y;
int gd=exgcd(A,B,x,y);
if(C%gd)return -1;
x=(x%B+B)%B;
// ax+by=c : x=(x*(C/gcd))
// ans <- ans+Mx : ans+=M*(x*(C/gcd))
ans+=(C/gd)*x%(B/gd)*M%(M*=B/gd);
ans%=M;
}
if(ans<mx)ans+=((mx-ans-1)/M+1)*M;
return ans;
}
/*--unfree--*/
SI void solve(){
s.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++)reward[i]=read();
for(int i=1;i<=m;i++)s.insert(read());
mx=0;
for(int i=1;i<=n;i++){
auto u=s.upper_bound(a[i]);
if(u!=s.begin())u--;
b[i]=*u;
s.erase(u);
s.insert(reward[i]);
mx=max(mx,(a[i]-1)/b[i]+1);
}
writeln(exCRT());
}
原题:P4774
和第一篇题解对比了,没有发现哪里写挂了
int <- __int128