求助
查看原帖
求助
661274
Brainless_zxc楼主2024/8/19 22:13
#include<bits/stdc++.h>
#define int __int128
#define modddd 998244353
using namespace std;
long long n,m,Eu[605],Ev[605];
long long k,Ew[605];
__int128 inf;
inline __int128 ksm(__int128 a,__int128 b){
	if(b==0){
		return 1;
	}
	if(b==1){
		return a;
	}
	__int128 tmp=ksm(a,b/2);
	if(b%2==0){
		return tmp*tmp%modddd;
	}
	else{
		return tmp*tmp%modddd*a%modddd;
	}
}
inline __int128 inv(__int128 x){
	return ksm(x,modddd-2)%modddd;
}
inline void write(__int128 &a){
	if(a<0){
		putchar('-');
		a=-a;
	}
	if(a>=10){
		__int128 ovo=a/10;
		write(ovo);
	}
	putchar(a%10+'0');
}
namespace Solve1{
	__int128 dis[605],updis[605];
	inline void wrk(){
		fill(updis+1,updis+n+1,2*inf);
		for(int i=1;i<=m;i++){
			updis[Ev[i]]=min(updis[Ev[i]],dis[Eu[i]]+Ew[i]);
		}
		copy_n(updis+1,n,dis+1);
	}
	__int128 cyc[605][605], ray[605][605];
	inline void SLVR() {
		fill(dis+1,dis+n+1,2*inf);
		dis[1]=0;
		long long LEN=n*(n+1)*3;
		if(k<=2*LEN){
			for(int t=1;t<=k;t++){
				wrk();
			}
		}
		else{
			long long mid=k-LEN*2;
			for(int i=1;i<=n;i++){
				fill(dis+1,dis+n+1,2*inf);
				dis[i]=0;
				for(int j=1;j<=n;j++){
					wrk();
					if(dis[i]<inf){
						cyc[i][j]=dis[i];
					}
					else{
						cyc[i][j]=-1;
					}
				}
			}
			fill(dis+1,dis+n+1,2*inf);
			dis[1]=0;
			for(int t=1;t<=LEN;t++){
				wrk();
			}
			for(int i=1;i<=n;i++){
				for(int j=1;j<=n;j++){
					ray[i][j]=2*inf;
				}
			}
			for(int i=1;i<=n;i++){
				if(dis[i]<inf){
					for(int j=1;j<=n;j++){
						if(~cyc[i][j]){
							long long t=mid/j+1;
							long long sm=t*j-mid;
							ray[sm][i]=min(ray[sm][i],dis[i]+(__int128)t*cyc[i][j]);
						}
					}
				}
			}
			fill(dis+1,dis+n+1,2*inf);
			for(int t=1;t<=LEN;t++){
				wrk();
				if(t<=n){
					for(int i=1;i<=n;i++){
						dis[i]=min(dis[i],ray[t][i]);
					}
				}
			}
		}
		for(int i=1;i<=n;i++){
			if(dis[i]>inf){
				cout<<-1;
			}
			else{
				__int128 anssss=dis[i]%modddd;
				write(anssss);
			}
			if(i==n){
				cout<<endl;
			}
			else{
				cout<<" ";
			}
		}
	}
}
namespace Solve2{
	__int128 dis[605],updis[605];
	struct Frac{
		int L;
		__int128 S;
		Frac(__int128 sum=0,int len=0){
			L=len;
			S=sum;
		}
	};
	inline bool operator<(const Frac &lhs,const Frac &rhs){
		return lhs.S*rhs.L<rhs.S*lhs.L;
	}
	inline bool operator==(const Frac &lhs,const Frac &rhs){
		return lhs.S*rhs.L==rhs.S*lhs.L;
	}
	struct Node{
		Frac a,b;
		Node(Frac A=Frac(1,1),Frac B=Frac(1,1)){
			a=A;
			b=B;
		}
	};
	bool flag;
	__int128 K,LIM;
	inline bool operator<(const Node &x,const Node &y){
		__int128 vl1=x.a.S*y.a.L;
		__int128 vl2=x.a.L*y.a.S;
		if(vl1==vl2){
			return x.b<y.b;
		}
		if(flag){
			return vl1<vl2;
		}
		__int128 dt=vl1-vl2;
		return (-LIM<=dt&&dt<=LIM)?dt*K+x.b.S*y.b.L<x.b.L*y.b.S:vl1<vl2;
	}
	Node Nd_inf=Node(Frac((__int128)1e31,1),Frac((__int128)1e31,1));
	inline void wrk(){
		fill(updis+1,updis+1+n,2*inf);
		for(int i=1;i<=m;i++){
			updis[Ev[i]]=min(updis[Ev[i]],dis[Eu[i]]+Ew[i]);
		}
		copy_n(updis+1,n,dis+1);
	}
	Node tempdis[605],tempud[605];
	inline void SAP(){
		fill(tempud+1,tempud+1+n,Nd_inf);
		for(int i=1;i<=m;i++){
			auto cur=tempdis[Eu[i]];
			cur.b.S+=(__int128)Ew[i]*cur.b.L;
			tempud[Ev[i]]=min(tempud[Ev[i]],cur);
		}
		copy_n(tempud+1,n,tempdis+1);
	}
	__int128 cyc[605][605];
	Node ray[605][605];
	inline void SLVR(string S) {
		fill(dis+1,dis+n+1,2*inf);
		dis[1]=0;
		long long LEN=n*(n+1)*2;
		long double tmp=0;
		for(auto ch:S){
			tmp=tmp*10+(ch^48);
		}
		if(tmp>(__int128)1e27){
			flag=1;
		}
		else{
			flag=0;
			K=0;
			for(auto ch:S){
				K=K*10+(ch^48);
			}
			K -= LEN * 2;
			if(K){
				LIM=2e36/K;
			}
		}
		for(int i=1;i<=n;i++){
			fill(dis+1,dis+n+1,2*inf);
			dis[i]=0;
			for(int j=1;j<=n;j++){
				wrk();
				if(dis[i]<inf){
					cyc[i][j]=dis[i];
				}
				else{
					cyc[i][j]=-1;
				}
			}
		}
		fill(dis+1,dis+n+1,2*inf);
		dis[1]=0;
		for(int t=1;t<=LEN;t++){
			wrk();
		}
		vector<int>pos(n+1);
		__int128 w=0;
		for(int i=1;i<=n;i++){
			w=0;
			for(auto &ch:S){
				w=w*10+(ch^48);
				w%=i;
			}
			pos[i]=((w-LEN*2)%i+i)%i;
		}
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				ray[i][j]=Nd_inf;
			}
		}
		for(int i=1;i<=n;i++){
			if(dis[i]<inf){
				__int128 sm=0;
				for(int j=1;j<=n;j++){
					if(~cyc[i][j]){
						sm=j-pos[j];
						ray[sm][i]=min(ray[sm][i],Node(Frac(cyc[i][j],j),Frac(dis[i]*j+sm*cyc[i][j],j)));
					}
				}
			}
		}
		for(int i=1;i<=n;i++){
			tempdis[i]=Nd_inf;
		}
		for(int t=1;t<=LEN;t++){
			SAP();
			if(t<=n){
				for(int i=1;i<=n;i++){
					tempdis[i]=min(tempdis[i],ray[t][i]);
				}
			}
		}
		__int128 num=0;
		for(auto ch:S){
			num*=10;
			num%=modddd;
			num+=(ch^48);
			num%=modddd;
		}
		num=(num%modddd+modddd)%modddd;
		num-=(LEN%modddd*2%modddd);
		num=(num%modddd+modddd)%modddd;
		for(int i=1;i<=n;i++){
			auto r=tempdis[i];
			if((long double)r.a.S/r.a.L>(__int128)2e18){
				cout<<-1<<" ";
			}
			else{
				__int128 awawa=((num*r.a.S%modddd+r.b.S%modddd)%modddd)%modddd*inv(r.b.L%modddd)%modddd;
				awawa%=modddd;
				write(awawa);
				putchar(' ');
			}
		}
		cout<<endl;
	}
}
inline void solve(){
	string S;
	cin>>n>>m>>S;
	long double tmp=0;
	for(auto ch:S){
		tmp=tmp*10+(ch^48);
	}
	for(int i=1;i<=m;i++){
		cin>>Eu[i]>>Ev[i]>>Ew[i];
	}
	if(tmp<=n*n*10){
		k=0;
		for(auto ch:S){
			k=k*10+(ch^48);
		}
		Solve1::SLVR();
		return;
	}
	Solve2::SLVR(S);
}
long long test_case;
signed main(){
	inf=numeric_limits<__int128>::max()/10;
	cin>>test_case>>test_case;
	while(test_case--){
		solve();
	}
	return 0;
}

同一份代码,交到 C++14(O2) 就可以 AC 而 C++14(GCC9) (O2) 却不行,为什么呢/xk

2024/8/19 22:13
加载中...