WA#4.5.6.18.19,20输出-1,求条!
查看原帖
WA#4.5.6.18.19,20输出-1,求条!
1283888
zhuxuanze楼主2025/7/28 16:40
#include<bits/stdc++.h>
#define int __int128
using namespace std;
int read(){
	int res=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)){res=res*10+ch-'0';ch=getchar();}
	return res*f;
}
void write(int x){
    if(x<0){putchar('-'),x=-x;}
    if(x>9)write(x/10);
    putchar(x%10+'0');
    return;
}
multiset<int>s;
int T;
int n,m;
int maxn;
int a[100100],p[100100],d[100100],b,t[100100];
int x,y;
void exgcd(int a,int b,int c,int &g){
	if(b==0){
		x=c/a,y=1;
		g=a;
		return ;
	}
	exgcd(b,a%b,c,g);
	int lx=x,ly=y;
	x=ly,y=lx-a/b*ly;
}
int gcd(int x,int y){
	if(y==0)return x;
	return gcd(y,x%y);
}
int lcm(int x,int y){
	return x/gcd(x,y)*y;
}
int excrt(){
	int ans=0,mod=1;
	for(int i=1;i<=n;i++){
		int A=t[i]*mod,B=p[i],C=a[i]-ans*t[i];
		int g;
		exgcd(A,B,C,g);
		if(C%g!=0)return -1;
		int tmp=B/g;
		x=(x%tmp+tmp)%tmp;
		int tm=mod;
		mod=lcm(mod,p[i]);
		ans=(ans%mod+tm%mod*x%mod)%mod;
		ans=(ans%mod+mod)%mod;
	}
	if(ans<maxn)ans=ans+((maxn-ans-1)/mod+1)*mod;
	return ans;
}
signed main(){
	T=read();
	while(T--){
		s.clear();
		n=read(),m=read();
		maxn=-INT_MIN;
		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++)d[i]=read();
		for(int i=1;i<=m;i++){
			b=read();
			s.insert(b);
		}
		for(int i=1;i<=n;i++){
			multiset<int>::iterator it=s.upper_bound(a[i]);
			if(it!=s.begin())it--;
			t[i]=*it,s.erase(it),s.insert(d[i]);
			maxn=max(maxn,(a[i]-1)/t[i]+1);
		}
		write(excrt());
		printf("\n");
	}
	return 0;
}
2025/7/28 16:40
加载中...