10WA求条
查看原帖
10WA求条
1284088
meifan666楼主2025/7/25 13:26
#include<bits/stdc++.h>
using namespace std;
#define int __int128
#define N 100100
int T,n,m,a[N],p[N],f[N],s,k1,k2,minx;
bool flag;
struct exCRT{
	int f,a,b;//mod a=b 
}ec[N];
multiset<int>st;
void exgcd(int a,int& x,int b,int& y,int c){
	if(b==0){
		x=c/a,y=0;
		return;
	}
	exgcd(b,y,a%b,x,c);
	y-=a/b*x;
}
int lcm(int x,int y){
	return x/__gcd(x,y)*y;
}
int iabs(int x){
	return x<0?-x:x;
}
int read(){
	int k=1,ans=0;char s=getchar();
	while(s<'0'||s>'9'){if(s=='-')k=-1;s=getchar();}
	while(s>='0'&&s<='9'){ans=ans*10+s-'0';s=getchar();}
	return k*ans;
}
void write(int x){
	if(x<0)putchar('-'),x=-x;
	int sta[40],t=0;
	do{sta[t++]=x%10,x/=10;}while(x);
	while(t)putchar(sta[--t]+'0');
}
signed main(){
	freopen("P4774_3.in","r",stdin); 
	T=read();
	while(T--){
		n=read(),m=read(),st.clear();flag=0,minx=LLONG_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++)f[i]=read();
		while(m--){
			s=read();
			st.insert(s);
		}
		for(int i=1;i<=n;i++){
			set<int>::iterator t=st.upper_bound(a[i]);
			if(t!=st.begin())--t;
			ec[i]={*t,p[i],a[i]%p[i]};
			minx=max(minx,(a[i]-1)/ *t+1);
			st.erase(*t);st.insert(f[i]);
		}
		for(int i=2;i<=n;i++){
			int f2=ec[i].f,f1=ec[i-1].f,a1=ec[i-1].b,a2=ec[i].b,p1=ec[i-1].a,p2=ec[i].a;
			if(iabs(f1*a2-f2*a1)%__gcd(iabs(f2*p1),iabs(f1*p2))){
				flag=1;
				break;
			}
			exgcd(f2*p1,k1,-f1*p2,k2,f1*a2-f2*a1);
			s=lcm(p1,p2);
			int x=(a1+k1*p1)%s;
			ec[i]={f1,s,(x+s)%s};
		}
		if(flag)puts("-1");
		else{
			int a=ec[n].b;
			if(a>=minx){
				write(a);
				puts("");
			}else{
				int d=lcm(ec[n].f,ec[n].a);
				int k=(minx-a-1)/d+1;
				write(a+k*d);
				puts("");
			}
		}
	}
	return 0;
}
2025/7/25 13:26
加载中...