压位高精
  • 板块灌水区
  • 楼主MA_master
  • 当前回复8
  • 已保存回复8
  • 发布时间2022/8/21 23:45
  • 上次更新2023/10/27 14:14:40
查看原帖
压位高精
677656
MA_master楼主2022/8/21 23:45
#include<bits/stdc++.h>
#define ll long long
#define mxx 100000000//满此数进一(十的 压的位数 次方)
#define mxw 8//压的位数
#define www 2002//最大位数除以压的位数
using namespace std;
char c;
ll n[www],m[www],ans[www];
inline void rd(ll &x);//低读(快读)O(N)
inline void pt(ll x);//低写(快写)O(N)
inline void rrdd(ll rrd[www]);//压位高读 O(N)
inline void pptt(ll ppt[www]);//压位高写 O(N)
inline ll cmpb(ll cm[www],ll cp[www]);//压位高比(0为cm大,1为cp大,2为一样)O(1)~O(N)
inline void adda(ll ada[www],ll adb[www],ll x);//压位高加低(结果,高数,低数)O(N)
inline void addb(ll ads[www],ll adb[www],ll adc[www]);//压位高加高(结果,数1,数2)O(N)
inline void suba(ll su[www],ll sb[www],ll x);//压位高减低(结果,被减数,减数)O(1)~O(N)
inline void subb(ll sub[www],ll su[www],ll sb[www]);//压位高减高(结果,被减数,减数)O(N)
inline void mula(ll mu[www],ll ml[www],ll x);//压位高乘低(结果,高数,低数)O(N)
inline void mulb(ll mu[www],ll ml[www],ll mul[www]);//压位高乘高(结果,数1,数2)O(N^2)
inline void dela(ll de[www],ll &y,ll dl[www],ll x);//压位高除低(结果,余数,被除数,除数)O(N)
inline void delb(ll &dee,ll dll[www],ll de[www],ll dl[www]);//压位同位高除高(商,余数,被除数,除数)(de/dl<mxx)O(log(mxx)*N)
inline void delc(ll dee[www],ll dll[www],ll de[www],ll dl[www]);//压位非同位高除高(商,余数,被除数,除数)O(log(mxx)*N^2)

inline void rd(ll &x){
	x=0;short f=1;char c=getchar();
	while((c<'0'||c>'9')&&c!='-') c=getchar();
	if(c=='-') c=getchar(),f=-1;
	while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
	x*=f;
}
inline void pt(ll x){
	if(x<0) putchar('-'),x=-x;
	if(x>9) pt(x/10);
	putchar((x%10)+'0');
}
inline void rrdd(ll rrd[www]){
	for(ll i=1;i<www;i++) rrd[i]=0;
	rrd[0]=1;
	ll t=0,rrrd[www*mxw]={};
	short f=1;c=getchar();
	if(c=='-') c=getchar(),f=-1;
	while((c<'0'||c>'9')&&c!='-') c=getchar();
	while(c>='0'&&c<='9') rrrd[++rrrd[0]]=c-'0',c=getchar();
	rrd[0]=t=(rrrd[0]-1)/mxw+1;
	for(ll i=1;i<=rrrd[0];i++){
		rrd[t]=rrd[t]*10+rrrd[i];
		if((rrrd[0]-i)%mxw==0) t--;
	}
	rrd[rrd[0]]*=f;
}
inline void pptt(ll ppt[www]){
	while(!ppt[ppt[0]]&&ppt[0]) ppt[0]--;
	if(!ppt[0]) ppt[0]=1;
	pt(ppt[ppt[0]]);
	for(ll i=ppt[0]-1;i>0;i--)
		for(ll j=mxx/10;j;j/=10)
			pt((ppt[i]/j)%10);
}
inline ll cmpb(ll cm[www],ll cp[www]){
	while(!cm[cm[0]]&&cm[0]) cm[0]--;
	while(!cp[cp[0]]&&cp[0]) cp[0]--;
	if(!cm[0]) cm[0]=1;
	if(!cp[0]) cp[0]=1;
	if(cm[0]>cp[0]) return cm[cm[0]]<0;
	if(cm[0]<cp[0]) return cp[cp[0]]>=0;
	if(cm[cm[0]]<0&&cp[cp[0]]>=0) return 1;
	if(cm[cm[0]]>=0&&cp[cp[0]]<0) return 0;
	ll l=cm[0],r=cp[0];
	while(l&&r&&cm[l]==cp[r]) l--,r--;
	return l?(cm[l]<cp[r])^(cm[cm[0]]<0&&cp[cp[0]]<0):2;
}
inline void adda(ll ada[www],ll adb[www],ll x){
	ll adc[www]={};
	adc[0]=1,adc[1]=x;
	addb(ada,adb,adc);
}
inline void addb(ll ads[www],ll adb[www],ll adc[www]){
	while(!adb[adb[0]]&&adb[0]) adb[0]--;
	while(!adc[adc[0]]&&adc[0]) adc[0]--;
	if(!adb[0]) adb[0]=1;
	if(!adc[0]) adc[0]=1;
	short fb=1,fc=1;
	if(adb[adb[0]]<0) fb=-1,adb[adb[0]]*=-1;
	if(adc[adc[0]]<0) fc=-1,adc[adc[0]]*=-1;
	if(fb==-1&&fc==1) subb(ads,adc,adb);
	else if(fb==1&&fc==-1) subb(ads,adb,adc);
	else{
		ll ada[www];
		for(ll i=0;i<www;i++)
			ada[i]=adb[i];
		ada[0]=max(ada[0],adc[0]);
		ll t=0;
		for(ll i=1;i<=ada[0];i++)
			ada[i]+=adc[i]+t,t=ada[i]/mxx,ada[i]%=mxx;
		if(t) ada[++ada[0]]=t;
		for(ll i=0;i<www;i++)
			ads[i]=ada[i];
		ads[ads[0]]*=fb;
	}
	adb[adb[0]]*=fb;
	adc[adc[0]]*=fc;
}
inline void suba(ll su[www],ll sb[www],ll x){
	ll suu[www]={};
	suu[0]=1,suu[1]=x;
	subb(su,sb,suu);
}
inline void subb(ll sub[www],ll su[www],ll sb[www]){
	while(!su[su[0]]&&su[0]) su[0]--;
	while(!sb[sb[0]]&&sb[0]) sb[0]--;
	if(!su[0]) su[0]=1;
	if(!sb[0]) sb[0]=1;
	short fu=1,fb=1;
	if(su[su[0]]<0) fu=-1;
	if(sb[sb[0]]<0) fb=-1;
	if(fu==-1&&fb==1||fu==1&&fb==-1) sb[sb[0]]*=-1,addb(sub,su,sb),sb[sb[0]]*=-1;
	else if(fu==-1&&fb==-1) su[su[0]]*=-1,sb[sb[0]]*=-1,subb(sub,sb,su),su[su[0]]*=-1,sb[sb[0]]*=-1;
	else if(cmpb(su,sb)==1) subb(sub,sb,su),sub[sub[0]]*=-1;
	else{
		ll suu[www];
		for(ll i=0;i<www;i++)
			suu[i]=su[i];
		for(ll i=1;i<=suu[0];i++)
			suu[i]-=sb[i],suu[i+1]-=(suu[i]<0),suu[i]=(suu[i]+mxx)%mxx;
		while(!suu[suu[0]]&&suu[0]) suu[0]--;
		if(!suu[0]) suu[0]=1;
		for(ll i=0;i<www;i++)
			sub[i]=suu[i];
	}
}
inline void mula(ll mu[www],ll ml[www],ll x){
	while(!ml[ml[0]]&&ml[0]) ml[0]--;
	if(!ml[0]) ml[0]=1;
	short fl=1,fx=1;
	if(ml[ml[0]]<0) fl=-1,ml[ml[0]]*=-1;
	if(x<0) fx=-1,x=-x;
	for(ll i=0;i<www;i++)
		mu[i]=ml[i];
	ll t=0;
	for(ll i=1;i<=mu[0];i++)
		mu[i]=mu[i]*x+t,t=mu[i]/mxx,mu[i]%=mxx;
	if(t) mu[++mu[0]]=t,t=mu[mu[0]]/mxx,mu[mu[0]]%=mxx;
	if(t) mu[++mu[0]]=t;
	ml[ml[0]]*=fl;
	x*=fx;
	mu[mu[0]]*=fl*fx;
}
inline void mulb(ll mu[www],ll ml[www],ll mul[www]){
	while(!ml[ml[0]]&&ml[0]) ml[0]--;
	while(!mul[mul[0]]&&mul[0]) mul[0]--;
	if(!ml[0]) ml[0]=1;
	if(!mul[0]) mul[0]=1;
	short fl=1,fu=1;
	if(ml[ml[0]]<0) fl=-1,ml[ml[0]]*=-1;
	if(mul[mul[0]]<0) fu=-1,mul[mul[0]]*=-1;
	ll t=0,mmu[www]={},mmmu[www]={};
	for(ll i=mul[0];i>0;i--)
		mula(mmmu,mmmu,mxx),mula(mmu,ml,mul[i]),addb(mmmu,mmmu,mmu);
	for(ll i=0;i<www;i++)
		mu[i]=mmmu[i];
	ml[ml[0]]*=fl;
	mul[mul[0]]*=fu;
	mu[mu[0]]*=fl*fu;
}
inline void dela(ll de[www],ll &y,ll dl[www],ll x){
	while(!dl[dl[0]]&&dl[0]) dl[0]--;
	if(!dl[0]) dl[0]=1;
	for(ll i=0;i<www;i++)
		de[i]=dl[i];
	if(de[de[0]]<x)
		de[de[0]-1]+=de[de[0]]*mxx,de[0]--;
	ll t=0;
	for(ll i=de[0];i>0;i--)
		de[i]+=t*mxx,t=de[i]%x,de[i]/=x;
	y=t;
}
inline void delb(ll &dee,ll dll[www],ll de[www],ll dl[www]){
	while(!de[de[0]]&&de[0]) de[0]--;
	while(!dl[dl[0]]&&dl[0]) dl[0]--;
	if(!de[0]) de[0]=1;
	if(!dl[0]) dl[0]=1;
	ll cm=cmpb(de,dl);
	if(cm==2){
		for(ll i=0;i<www;i++)
			dll[i]=0;
		dll[0]=dee=1;
	}else if(cm){
		for(ll i=0;i<www;i++)
			dll[i]=de[i];
		dee=0;
	}else{
		ll len=(ll)ceil(log2(1.0*mxx)),ecf[len],del[www],dell[www];
		ecf[0]=1;dee=0;
		for(ll i=1;i<len;i++)
			ecf[i]=ecf[i-1]<<1;
		for(ll i=0;i<www;i++)
			dell[i]=de[i];
		for(ll i=len-1;i>=0;i--){
			mula(del,dl,ecf[i]);
			if(cmpb(del,dell))
				subb(dell,dell,del),dee+=ecf[i];
		}
		for(ll i=0;i<www;i++)
			dll[i]=dell[i];
	}
}
inline void delc(ll dee[www],ll dll[www],ll de[www],ll dl[www]){
	while(!de[de[0]]&&de[0]) de[0]--;
	while(!dl[dl[0]]&&dl[0]) dl[0]--;
	if(!de[0]) de[0]=1;
	if(!dl[0]) dl[0]=1;
	if(de[0]<=dl[0]){
		ll w,del[www];
		delb(w,del,de,dl);
		for(ll i=0;i<www;i++)
			dee[i]=0,dll[i]=del[i];
		dee[0]=1;dee[1]=w;
		return;
	}
	ll del[www]={dl[0]+1},dell[www]={de[0]-dl[0]+1};
	for(ll i=1;i<dl[0];i++)
		del[dl[0]-i]=de[de[0]-i+1];
	for(ll i=dell[0],w;i;i--){
		del[0]=dl[0]+1;
		for(ll j=del[0];j>1;j--)
			del[j]=del[j-1];
		del[1]=de[i];
		delb(w,del,del,dl);
		dell[i]=w;
	}
	while(!dell[dell[0]]&&dell[0]) dell[0]--;
	while(!del[del[0]]&&del[0]) del[0]--;
	if(!dell[0]) dell[0]=1;
	if(!del[0]) del[0]=1;
	for(ll i=0;i<www;i++)
    	dee[i]=dell[i],dll[i]=del[i];
}

第5行的mxw能改成16吗?会有影响吗?有什么用?

2022/8/21 23:45
加载中...