TLE 14-20求助
查看原帖
TLE 14-20求助
721928
cats142857楼主2022/7/24 15:04
#include <bits/stdc++.h>
using namespace std;
long long a[100000],b[100000],health[100000],recover[100000],drop[100000],swd[100000];
multiset<long long> sword;
multiset<long long>::iterator it;
struct exg{
	long long gcd;
	long long x;
	long long y;
};
long long fastread(){
	char ch=getchar();
	long long x=0;
	while(ch<'0'||ch>'9')
	{
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x;
}
exg exgcd(long long aa,long long bb){
	exg e;
	if(bb==0)
	{
		e.x=1;
		e.y=0;
		e.gcd=aa;
		return e;
	}
	e=exgcd(bb,aa%bb);
	long long mem=e.y;
	e.y=e.x-aa/bb*e.y;
	e.x=mem;
	return e;
}
long long timmod(long long aa,long long bb,long long mod){
	long long ans=0,math=aa,flag=1;
	if(bb<0)
	{
		bb=-bb;
		flag=-1;
	}
	while(bb>0)
	{
		if(bb&1)
		{
			ans+=math;
			ans%=mod;
		}
		math=math+math;
		math%=mod;
		bb>>=1;
	}
	return ans*flag;
}
long long excrt(int n){
	int i;
	long long k,lcm;
	exg e;
	for(i=1;i<n;i++)
	{
		e=exgcd(a[i-1],a[i]);
		if((b[i]-b[i-1])%e.gcd!=0)return -1;
		lcm=a[i-1]/e.gcd*a[i];
		k=timmod(e.x,(b[i]-b[i-1])/e.gcd,lcm);
		b[i]=(timmod(k,a[i-1],lcm)+b[i-1])%lcm;
		if(b[i]<0)b[i]+=lcm;
		a[i]=lcm;
	}
	return b[n-1];
}
int main(int argc, char** argv) {
	int t,n,m,i,flag;
	long long maxi,tmp,x;
	exg e;
	for(t=fastread();t>0;t--)
	{
		maxi=0;
		n=fastread();
		m=fastread();
		for(i=0;i<n;i++)health[i]=fastread();
		for(i=0;i<n;i++)recover[i]=fastread();
		for(i=0;i<n;i++)drop[i]=fastread();
		for(i=0;i<m;i++)
		{
			tmp=fastread();
			sword.insert(tmp);
		}
		for(i=0;i<n;i++)
		{
			it=upper_bound(sword.begin(),sword.end(),health[i]);
			if(it!=sword.begin())it--;
			swd[i]=(*it);
			sword.erase(it);
			sword.insert(drop[i]);
		}
		for(i=0;i<n;i++)
		{
			if(maxi<(health[i]+swd[i]-1)/swd[i])maxi=(health[i]+swd[i]-1)/swd[i];
			health[i]%=recover[i];
		}
		flag=0;
		for(i=0;i<n;i++)
		{
			e=exgcd(swd[i],recover[i]);
			if(health[i]%e.gcd!=0)
			{
				flag=1;
				break;
			}
			swd[i]/=e.gcd;
			recover[i]/=e.gcd;
			health[i]/=e.gcd;
			b[i]=timmod(e.x,health[i],recover[i]);
			if(b[i]<0)b[i]+=recover[i];
			a[i]=recover[i];
		}
		if(flag==1)
		{
			cout<<"-1\n";
			continue;
		}
		x=excrt(n);
		if(x==-1)
		{
			cout<<"-1\n";
			continue;
		}
		if(x<maxi)x+=((maxi-x+a[n-1]-1)/a[n-1])*a[n-1];
		cout<<x<<'\n';
		sword.clear();
	}
	return 0;
}
2022/7/24 15:04
加载中...