lovely dog

给一棵以 1 为根的 \(n\) 个节点的有根树,以及一个整数 \(d\),对每个节点 \(i\)\(\sum_{i=1}^n\sum_{u\in t_i}\sum_{v\in t_i}f(a_ua_v),a_u\le a_v\),其中 \(f(x)=\prod [c_i\le d](-1)^{c_i}\;,\;x=\prod p_i^{c_i}\)\(t_i\) 为以 \(i\) 为根的子树集合。

\(n\le 2\times 10^5\)

这个询问形式考虑 dsu on tree,但是显然插入点相当困难,因为有 \([c_i\le d]\) 的限制,若是没有这个限制 \(f\) 就是完全积性函数,分配律搞一下就能直接插入。

考虑把询问换一下形式,设 \(g(x)=\prod (-1)^{c_i}\;,\;x=\prod p_i^{c_i}\)。询问转化为 \(\sum_{i=1}^n\sum_{u\in t_i}\sum_{v\in t_i}g(a_ua_v)\cdot [\nexists p>1,p^{d+1}|a_ua_v]\)

\(w(x)\) 为最大的 \(p\) 使得 \(p^{d+1}| x\),即:

\(\sum_{i=1}^n\sum_{u\in t_i}\sum_{v\in t_i}g(a_ua_v)\cdot [w(a_ua_v)=1]\)

发现这是莫反的形式 \(\underset{d|n}{\sum} \mu(d)=[n=1]\)

所以就转化成了

\[\sum_{i=1}^n\sum_{u\in t_i}\sum_{v\in t_i}g(a_ua_v)\sum_{p|w(a_ua_v)}\mu(p) \\=\sum_{i=1}^n\sum_{p\ge 1}\mu(p)\sum_{u\in t_i}\sum_{v\in t_i}g(a_ua_v)\cdot [p|w(a_ua_v)] \\=\sum_{i=1}^n\sum_{p\ge 1}\mu(p)\sum_{u\in t_i}g(a_u)\sum_{v\in t_i}g(a_v)\cdot [p|w(a_ua_v)] \\=\sum_{i=1}^n\sum_{p\ge 1}\mu(p)\sum_{u\in t_i}g(a_u)\sum_{v\in t_i}g(a_v)\cdot [p^{d+1}|a_ua_v] \]

解释一下为什么最后一步可以这么转:

\(w(a_ua_v)=t\)\(p|t\),那么 \(p|a_ua_v\)。且 \(p\le t\)\(p^{d+1}\le a_ua_v\),所以 \(p^{d+1}|a_ua_v\),两者表示的范围时一致的。

则插入节点 \(u\) 时,计算:

\(g(a_u)\sum_{p\ge 1}\mu(p)\sum_{v\in t_i} g(a_v)\cdot [p^{d+1}|a_ua_v] \\=g(a_u)\sum_{p\ge 1}\mu(p)\sum_{v\in t_i} g(a_v)\cdot [\frac{p^{d+1}}{\gcd(p^{d+1},a_u)}|a_v]\)

所以枚举 \(a_u\) 的因子 \(p\),因为若 \(p\) 不为 \(a_u\) 的因子且满足 \(p^{d+1}|a_ua_v\) 那么 \(p\) 必定有质因子 \(P^c\),且 \(a_u\) 有质因子 \(P^{C}\),满足 \(P^{c(d+1)}|a_ua_v\) 并且 \(c>C\),也就是 \(P^{d+1}|a_v\) 所以对于 \(f(a_v)\) 本就为 0。这类节点不插入就只用枚举 \(a_u\) 的因子了。

开桶维护 \(\sum_{i|a_v}g_v\),就能做到 \(O(\log n)\) 插入节点。

时间复杂度为 \(O(n\log^2n)\)

#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define Cinout ios::sync_with_stdio(false);cin.tie(0),cout.tie(0)
#define ll long long
#define int ll
inline int lowbit(int x){return x&-x;}
const int N=2e5+5;
vector<int>e[N],q[N];bool fl[N]; 
int dfn[N],siz[N],son[N],tot,idx[N],a[N],s[N],g[N],ans[N],sum,n,d,p[N],t,m[N],pw[N],f[N];
void dfs(int u,int fa){
	idx[dfn[u]=++tot]=u,siz[u]=1;
	for(int i:e[u])if(i^fa){
		dfs(i,u),siz[u]+=siz[i];
		if(siz[i]>siz[son[u]])son[u]=i;
	}
}
void add(int u,int d){
	if(!f[u])return;
	for(int i:q[u])s[i]+=d*g[u];
}
int get(int u){int res=0;
	if(!f[u])return 0;
	for(int i:q[u]){
		int T=pw[i],G=__gcd(T,u);if(T&&T/G<=n)res+=m[i]*s[T/G];
	}return g[u]*res;
}
void dfs1(int u,int fa){
	for(int i:e[u])if((i^fa)&&(i^son[u])){dfs1(i,u);
		for(int j=dfn[i],J=i;j<dfn[i]+siz[i];J=idx[++j])sum-=get(a[J]),add(a[J],-1); 
	}if(son[u])dfs1(son[u],u);add(a[u],1),sum+=get(a[u]);
	for(int i:e[u])if((i^fa)&&(i^son[u]))
		for(int j=dfn[i],J=i;j<dfn[i]+siz[i];J=idx[++j])add(a[J],1),sum+=get(a[J]);
	ans[u]=sum;
}
inline void UesugiErii(){
	cin>>n>>d;m[1]=g[1]=f[1]=pw[1]=1;
	for(int i=2;i<=n;i++){
		if(!fl[i])p[++t]=i,m[i]=g[i]=-1;
		for(int j=1;j<=t&&i*p[j]<=n;j++){
			fl[i*p[j]]=1;m[i*p[j]]=-m[i],g[i*p[j]]=-g[i];
			if(!(i%p[j])){m[i*p[j]]=0;break;}
		}f[i]=g[i];
	}
	for(int i=2;i<=n;i++){pw[i]=i;
		for(int j=1;j<=d;pw[i]*=i,j++)if(pw[i]>n*n){pw[i]=0;break;}
		if(pw[i]>n*n)pw[i]=0;if(pw[i])for(int j=pw[i];j<=n;j+=pw[i])f[j]=0;
	}
	for(int i=1;i<=n;i++)
		for(int j=i;j<=n;j+=i)q[j].pb(i);
	for(int i=1,u,v;i<n;i++)
		cin>>u>>v,e[u].pb(v),e[v].pb(u);
	for(int i=1;i<=n;i++)cin>>a[i]; 
	dfs(1,0),dfs1(1,0);
	for(int i=1;i<=n;i++)cout<<ans[i]<<'\n'; 
}
signed main(){
	freopen("dog.in","r",stdin);
	freopen("dog.out","w",stdout);
	Cinout;int _=1;//cin>>_;
	for(;_;_--)UesugiErii();
	return 0;
}
posted @ 2025-10-16 09:27  Uesugi1  阅读(4)  评论(0)    收藏  举报