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]\)。
所以就转化成了
解释一下为什么最后一步可以这么转:
若 \(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;
}

浙公网安备 33010602011771号