@yang12138
2018-06-22T00:03:16.000000Z
字数 1276
阅读 1071
未分类
题意:
给定个点的一颗树,树上每个点有个权值,边的长度均为,求所有互质的点对的距离的和.
对中等版本,有
对困难版本,有
题解:
对中等版本的数据:
考虑每条边的贡献,树上的每条边都会将树分成两个联通子树,那么对,如果,则会给答案造成的贡献.
考虑莫比乌斯反演,假设表示中点权为的倍数的点的个数,表示中点权为的倍数的点的个数,那么给答案造成的贡献为:
void union(Node& l,Node& r){
if(l.size<r.size()) swap(l,r);
l.ans1+=r.ans1;
for(map<int,int>::iterator it=r.mp.begin();it!=r.mp.end();++it){
int t1=l.mp[it->first],t2=t1+it->second;
l.ans2+=mobius[it->first]*(1LL*t1*t1-1LL*t2*t2);
l.mp[it->first]+=it->second;
}
}