RT,看讨论区 WA 后三个点都是没写龟速乘/没开 long long 的问题,但是窝实在没看出来自己哪里炸掉了,求各位大佬帮忙/wq
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int T,n,m,b[N],a[N],t[N],p[N];
multiset<int> q;
int x,y,maxn;
int mul(int n,int k,int p)
{
int ans=0;
while(k)
{
if(k&1) ans=(ans+n)%p;
n=(n+n)%p;k>>=1;
}
return ans;
}
void exgcd(int a,int b,int &gd)
{
if(!b)
{
x=1;y=0;gd=a;
return;
}
exgcd(b,a%b,gd);
int x0=x,y0=y;
x=y0;y=x0-(a/b)*y0;
}
int excrt()
{
int lcm=1,ans=0;
int A,B,C,gd;
for(int i=1;i<=n;i++)
{
A=mul(b[i],lcm,p[i]);B=p[i];
C=((a[i]-mul(b[i],ans,p[i]))%p[i]+p[i])%p[i];
exgcd(A,B,gd);x=(x%B+B)%B;
if(C%__gcd(A,B)) return -1;
ans=(ans+mul(mul(C/gd,x,B/gd),lcm,lcm*B/gd));
lcm*=B/gd;ans%=lcm;
}
if(ans<maxn) ans+=((maxn-ans-1)/lcm+1)*lcm;
return ans;
}
signed main()
{
scanf("%lld",&T);
while(T--)
{
maxn=0;q.clear();
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<=n;i++) scanf("%lld",&p[i]);
for(int i=1;i<=n;i++) scanf("%lld",&t[i]);
for(int i=1;i<=m;i++)
{
int qwq;
scanf("%lld",&qwq);
q.insert(qwq);
}
for(int i=1;i<=n;i++)
{
auto u=q.upper_bound(a[i]);
if(u!=q.begin()) u--;
b[i]=*u;q.erase(u);q.insert(t[i]);
maxn=max(maxn,1+(a[i]-1)/b[i]);
}
cout<<excrt()<<endl;
}
return 0;
}