TLE求优化
查看原帖
TLE求优化
333855
int233楼主2024/8/3 14:25

RT,数论和淀粉质好久没做来复健一下。

AC 23个点,TLE 16个点。

Code:

#include<iostream>
#include<vector>
#include<algorithm>
#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
const ll mod=998244353;
vector<ll> G[100005],vc[100005];
ll n,u,v,w[100005],e[100005],ans,c[100005],f[100005],g[100005],d[100005],mxid,mx,sum,sz[100005],a[100005],b[100005],r,vis[100005];
void shai(int n){
	a[0]=a[1]=1;
	e[1]=1;
	for(int i=2;i<=n;i++){
		if(!a[i]){
			b[++r]=i;
			e[i]=i-1;
		}
		for(int j=1;j<=r&&i*b[j]<=n;j++){
			a[i*b[j]]=1;
			if(i%b[j]==0){
				e[i*b[j]]=e[i]*b[j]%mod;
				break;
			}
			e[i*b[j]]=e[i]*e[b[j]]%mod;
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=i;j<=n;j+=i){
			vc[j].push_back(i);
		} 
	}
}
void dfs(int x,int fat){
	if(vis[x]){
		return ;
	}
	sum++;
	sz[x]=1;
	for(int i=0;i<G[x].size();i++){
		if(G[x][i]!=fat&&(!vis[G[x][i]])){
			dfs(G[x][i],x);
			sz[x]+=sz[G[x][i]];
		}
	}
}
void dfs2(int x,int fat){
	if(vis[x]){
		return ;
	}
	int ret=sum-sz[x];
	for(int i=0;i<G[x].size();i++){
		if(G[x][i]!=fat&&(!vis[G[x][i]])){
			dfs2(G[x][i],x);
			ret=max(ret,(int)sz[G[x][i]]);
		}
	}
	if(ret<mx){
		mx=ret;
		mxid=x;
	}
}
void dfs3(int x,int fat,ll c,ll d){
	if(vis[x]){
		return ;
	}
//	cout<<x<<" "<<fat<<" "<<c<<" "<<d<<endl; 
	ans+=(c+1)*d%mod;
	ans%=mod;
	for(ll i=0;i<vc[d].size();i++){
	//	cout<<x<<" "<<fat<<" "<<c<<" "<<d<<" "<<vc[d][i]<<" "<<f[vc[d][i]]<<endl; 
		ans+=(c+1)*f[vc[d][i]]%mod;
		ans%=mod;
	}
	for(ll i=0;i<vc[d].size();i++){
		ans+=g[vc[d][i]];
		ans%=mod;
	}
	for(int i=0;i<G[x].size();i++){
		if(G[x][i]!=fat&&(!vis[G[x][i]])){
			dfs3(G[x][i],x,c+1,__gcd(d,w[G[x][i]]));
		}
	}
}
void dfs4(int x,int fat,ll c,ll d){
	if(vis[x]){
		return ;
	}
	for(ll i=0;i<vc[d].size();i++){
		f[vc[d][i]]+=e[vc[d][i]];
		f[vc[d][i]]%=mod;
		g[vc[d][i]]+=e[vc[d][i]]*c%mod;
		g[vc[d][i]]%=mod;
	}
	for(int i=0;i<G[x].size();i++){
		if(G[x][i]!=fat&&(!vis[G[x][i]])){
			dfs4(G[x][i],x,c+1,__gcd(d,w[G[x][i]]));
		}
	}
}
void dfs5(int x,int fat,ll c,ll d){
	if(vis[x]){
		return ;
	}
	for(ll i=0;i<vc[d].size();i++){
		f[vc[d][i]]=g[vc[d][i]]=0;
	}
	for(int i=0;i<G[x].size();i++){
		if(G[x][i]!=fat&&(!vis[G[x][i]])){
			dfs5(G[x][i],x,c+1,__gcd(d,w[G[x][i]]));
		}
	}
}
void DFS(int x){
	dfs(x,0);
	mx=mxid=0;
	mx=1e9;
	dfs2(x,0);
	x=mxid;
	vis[x]=1;
	c[x]=0;
//	cout<<"ZX "<<w[x]<<endl;
	for(int i=0;i<G[x].size();i++){
		if(!vis[G[x][i]]){
			dfs3(G[x][i],x,1,__gcd(w[x],w[G[x][i]]));
			dfs4(G[x][i],x,1,__gcd(w[x],w[G[x][i]]));
		}
	}
	for(int i=0;i<G[x].size();i++){
		if(!vis[G[x][i]]){
			dfs5(G[x][i],x,1,__gcd(w[x],w[G[x][i]]));
		}
	}
	for(int i=0;i<G[x].size();i++){
		if(!vis[G[x][i]]){
			DFS(G[x][i]);
		}
	}
}
int main(){
	cin>>n;
	for(ll i=1;i<=n;i++){
		cin>>w[i];
	}
	for(ll i=1;i<=n-1;i++){
		cin>>u>>v;
		G[u].push_back(v);
		G[v].push_back(u);
	}
	shai(100000);
	DFS(1);
	cout<<ans;
	return 0;
} 

@General0826 gengen队能不能出动?

2024/8/3 14:25
加载中...