萌新求助中国剩余定理
查看原帖
萌新求助中国剩余定理
128591
Refined_heart楼主2021/10/7 16:27

这份代码只要不输出 1,-1, 其他的结果都是对的……不知道为什么错了,求大佬帮忙看看判断无解的部分 /kel

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
	int s=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch)){s=s*10+ch-'0';ch=getchar();}
	return s;
}
const int N=2e5+10;
inline void write(int x){
	if(x<0)putchar('-'),x=-x;
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
int T,a[N],p[N],v[N];
multiset<int>s;
int n,m,val[N];
void clear(){
	s.clear();
	for(int i=1;i<=n;++i)val[i]=p[i]=a[i]=v[i]=0;
}
inline int gcd(int x,int y){return !y?x:gcd(y,x%y);}
inline int lcm(int x,int y){return x/gcd(x,y)*y;}
inline int Add(int x,int y,int mod){return (x%mod+y%mod)%mod;}
inline int Min(int x,int y){return x<y?x:y;}
inline int Max(int x,int y){return x<y?y:x;}
inline int QMul(int x,int y,int mod){
	if(y<0) x=-x,y=-y;
	int res=0;
	while(y){
		if(y&1)res=Add(res,x,mod);
		x=Add(x,x,mod);y>>=1;
	}
	return res;
}
void Exgcd(int a,int b,int &x,int &y){
	if(!b){x=1;y=0;return;}
	Exgcd(b,a%b,x,y);
	int t=x;x=y;y=t-a/b*y;
}
void PreTreat(){
	for(int i=1;i<=n;++i){
		set<int>::iterator it=s.upper_bound(a[i]);
		--it;val[i]=*it;
		s.erase(it);s.insert(v[i]);
	}
}
int ExCRT(){
	int M=p[1];
	int root,yy;
	Exgcd(val[1],p[1],root,yy);
	root%=p[1];root+=p[1];root%=p[1];
	int G=gcd(val[1],p[1]);
	if(a[1]%G!=0)return -1;
	root=QMul(root,a[1]/G,p[1]/G);
	for(int i=2;i<=n;++i){
		int coe=QMul(val[i],M,p[i]);
		int qm=QMul(val[i],root,p[i]);
		int os=a[i]-qm;
//		assert(os>=0);
		int d=gcd(coe,p[i]);
		if(os%d!=0)return -1;
		int t,y;
		Exgcd(coe,p[i],t,y);
		t=QMul(t,os/d,p[i]/d);
		int nxt_m=lcm(M,p[i]);
		root=Add(root,QMul(t,M,nxt_m),nxt_m);
		M=nxt_m;root%=M;root+=M;root%=M;
	}
	root%=M;root+=M;root%=M;
	int times=0;
	for(int i=1;i<=n;++i){
		if(a[i]/val[i]>root){
			int cost=root*val[i];
			int c=a[i]-cost;
			if(c/M<=val[i]){
				times=Max(times,1);
				continue;
			}
			int unitval=M*val[i];
			int t=0;
			if(c%unitval==0)t=c/unitval;
			else t=c/unitval+1;
			times=Max(times,t);
		}
	}
	root=root+times*M;
	return root;
}
signed main(){
  	freopen("dragon2.in","r",stdin);
	T=read();
	while(T--){
		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)v[i]=read();
		for(int i=1;i<=m;++i){
			int x=read();
			s.insert(x);
		}
		PreTreat();
		int ans=ExCRT();
		write(ans);putchar('\n');
	}
	return 0;
}
2021/10/7 16:27
加载中...