Processing math: 100%

屠龙勇士

前置知识

平衡树(或者multiset<long long>)

扩展中国剩余定理

扩展欧几里得

开始

我们对于每一条龙,都要杀,并且全部按顺序杀

所以对于一条龙用的剑可以O(nlogn)平衡树搞出来(STL不香??)

那么我们便可以列举出一堆方程组

{A1xa1(modm1)A2xa2(modm2)Anxan(modmn)

是不是有点似曾相识?

这就是扩展中国剩余定理!!!

但是他带了系数,咋办?

我们得把左边Ai弄无

那么

Aixai(modmn)Aix=aimnkAix+mnk=ai

这就是扩展欧拉定理模板呗

如果无解输出-1

我们搞出x,k的值

定义

{lcm1=m1lcmi=lcm(lcmi1,mi)

很显然
x可以加上或减去任意lcmi1

于是有了xx0+klcmi1,kZ

xx0(modlcmi1)

于是就可以扩展中国剩余定理搞出来了

贴上代码

#include<bits/stdc++.h>
#define N 100011
#define ll long long
using namespace std;
multiset<ll>q;
int n,m;
inline ll mul(ll a,ll b,ll mod){
	if(b<0)a=-a,b=-b;
	ll ans(0);
	while(!!b){
		if(b&1)ans=(ans+a)%mod;
		a=(a<<1)%mod;
		b>>=1;
	}
	return (ans%mod+mod)%mod;
}
inline void exgcd(ll a,ll b,ll &x,ll &y,ll &d){
	if(!b){d=a;x=1;y=0;return;}
	exgcd(b,a%b,y,x,d);
	y-=a/b*x;
}
ll a[N],p[N],c[N];
inline void init( ){
	q.clear( );
	scanf("%d%d",&n,&m);
	int i;
	int op(0);
	ll g;
	for(i=1;i<=n;++i)
	scanf("%lld",&a[i]);
	for(i=1;i<=n;++i)scanf("%lld",&p[i]);
	for(i=1;i<=n;++i)
	scanf("%lld",&c[i]);
	while(m--){scanf("%lld",&g);q.insert(g);}
}
inline multiset<ll>::iterator find(ll k){
	multiset<ll>::iterator op;
	op=q.upper_bound(k);
	if(op!=q.begin( ))--op;
	return op;
}
inline ll gcd(ll a,ll b){
	return !b?a:gcd(b,a%b);
}
inline ll ceil(ll a,ll b){
	return (a+b-1)/b;
}
inline ll maxx(ll a,ll b){
	return a>b?a:b;
}
ll X,lcm;
inline void work( ){
	init( );
	int i;
	multiset<ll>::iterator k;
	ll x,y,d,QWQ(0);
	ll P,A;
	for(i=1;i<=n;++i){
		k=find(a[i]);
		exgcd(*k,p[i],x,y,d);
		if(a[i]%d!=0){puts("-1");return;}
		QWQ=maxx(QWQ,ceil(a[i],*k));
		A=mul(x,a[i]/d,p[i]/d);
		P=p[i]/d;
		if(i==1){
			lcm=P;
			X=A;
		}else{
			exgcd(lcm,P,x,y,d);
			if((A-X)%d!=0){puts("-1");return;}
			x=mul((A-X)/d,x,P/d);
			ll qwq(lcm);
			lcm=lcm/d*P;
			X=(X+(mul(x,qwq,lcm)%lcm+lcm)%lcm)%lcm;
		}
		q.erase(k);
		q.insert(c[i]);
	}
	if(!X)X=QWQ;
	printf("%lld\n",X);
}
int main( ){
	int t;
//	freopen("dragon2.in","r",stdin);
//	freopen("ans.out","w",stdout);
	scanf("%d",&t);
	while(t--)work( );
} 
posted @   Mikasa_Ackerman  阅读(102)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· SQL Server统计信息更新会被阻塞或引起会话阻塞吗?
阅读排行:
· 本地部署 DeepSeek:小白也能轻松搞定!
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 如何基于DeepSeek开展AI项目
点击右上角即可分享
微信分享提示