/*
树上莫比乌斯反演
求树上 满足 d|gcd(au,av) gcd(au,av)的对数f(d)
如何求:
建立200000层新图,即对于每个数建立一个新图
在加边时,给gcd(au,av)的约数层的图的uv加边
f[i]表示第i层的满足条件 i | gcd(a[u],a[v]) 的对数,那么求一遍并查集,在合并过程中更新f[i]即可,
同时要注意f[i]初始值为这层的有效结点数量,对应i|gcd(a[u],a[u])这样的情况 然后用莫比乌斯反演来求最后答案g[d]=sigma(u[i]*f[i*d])

*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 200005 int phi[maxn],mu[maxn],prime[maxn],m;
bool vis[maxn];
void init(){//打表mu
phi[]=mu[]=;
for(int i=;i<maxn;i++){
if(!vis[i]){
mu[i]=-;prime[++m]=i;phi[i]=i-;
}
for(int j=;j<=m;j++){
if(i*prime[j]>=maxn)break;
vis[i*prime[j]]=;
if(i%prime[j]==){
phi[i*prime[j]]=phi[i]*prime[j];
mu[i*prime[j]]=;
break;
}
else phi[i*prime[j]]=phi[i]*(prime[j]-),mu[i*prime[j]]=-mu[i];
}
}
} int n,a[maxn];
long long f[maxn],u[maxn],v[maxn];
vector<int>vec[maxn];//每层的边的下标集合 int F[maxn],size[maxn];
int find(int x){
return F[x]==x?x:F[x]=find(F[x]);
}
void bing(int i,int u,int v){
int t1=find(u),t2=find(v);
if(t1==t2)return;
f[i]+=(long long)size[t1]*size[t2];
size[t1]+=size[t2];F[t2]=t1;
} int main(){
init();
cin>>n;
for(int i=;i<=n;i++){
cin>>a[i];
for(int j=;j*j<=a[i];j++)
if(a[i]%j==){
f[j]++;
if(a[i]/j!=j)f[a[i]/j]++;
}
}
for(int i=;i<n;i++){//建立2000000层新图
scanf("%d%d",&u[i],&v[i]);
int tmp=__gcd(a[u[i]],a[v[i]]);
for(int j=;j*j<=tmp;j++)
if(tmp%j==){
vec[j].push_back(i);
if(tmp/j!=j)
vec[tmp/j].push_back(i);
}
}
//求并查集
for(int i=;i<=;i++){
for(int j=;j<vec[i].size();j++){//先初始化每层对应的并查集
int uu=u[vec[i][j]],vv=v[vec[i][j]];
F[uu]=uu;F[vv]=vv;
size[uu]=;size[vv]=;
}
for(int j=;j<vec[i].size();j++){//再进行合并求值
int uu=u[vec[i][j]],vv=v[vec[i][j]];
bing(i,uu,vv);
}
}
//反演+输出
for(int d=;d<=;d++){
long long ans=;
for(int i=;i*d<=;i++)
ans+=(long long)mu[i]*f[i*d];
if(ans!=)
cout<<d<<" "<<ans<<'\n';
}
}

树上莫比乌斯反演+分层图并查集——cf990G的更多相关文章

  1. 【bzoj2049】[Sdoi2008]Cave 洞穴勘测——线段树上bfs求可撤销并查集

    题面 2049: [Sdoi2008]Cave 洞穴勘测 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 12030 Solved: 6024 Desc ...

  2. HDU 4750 Count The Pairs ★(图+并查集+树状数组)

    题意 给定一个无向图(N<=10000, E<=500000),定义f[s,t]表示从s到t经过的每条路径中最长的边的最小值.Q个询问,每个询问一个t,问有多少对(s, t)使得f[s, ...

  3. CSP2019 D1T3 树上的数 (贪心+并查集)

    题解 因为博主退役了,所以题解咕掉了.先放个代码 CODE #include<bits/stdc++.h> using namespace std; const int MAXN = 20 ...

  4. hdu 5458 Stability(树链剖分+并查集)

    Stability Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 65535/102400 K (Java/Others)Total ...

  5. C - BLG POJ - 1417 种类并查集加dp(背包)

    思路:刚看这道题感觉什么都不清楚,人物之间的关系一点也看不出来,都不知道怎么写,连并查集都没看出来,但是你可以仔细分析一下,当输入字符串为“yes”的时候,我们设输入的值为x和y,当x为天使是则由题可 ...

  6. poj 3310(并查集判环,图的连通性,树上最长直径路径标记)

    题目链接:http://poj.org/problem?id=3310 思路:首先是判断图的连通性,以及是否有环存在,这里我们可以用并查集判断,然后就是找2次dfs找树上最长直径了,并且对树上最长直径 ...

  7. 【bzoj3362/3363/3364/3365】[Usaco2004 Feb]树上问题杂烩 并查集/树的直径/LCA/树的点分治

    题目描述 农夫约翰有N(2≤N≤40000)个农场,标号1到N,M(2≤M≤40000)条的不同的垂直或水平的道路连结着农场,道路的长度不超过1000.这些农场的分布就像下面的地图一样, 图中农场用F ...

  8. 图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用

    图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 ...

  9. HDU 2545 树上战争 (并查集+YY)

    题意:给一棵树,如果树上的某个节点被某个人占据,则它的所有儿子都被占据,lxh和pfz初始时分别站在两个节点上,lxh总是先移动 ,谁当前所在的点被另一个人占据,他就输了比赛,问谁能获胜 比较有意思的 ...

随机推荐

  1. Galaxy

    Galaxy 在一维坐标轴上给出n个点,第i个点坐标为\(x_i\),现在你可以任意移动k个点的,最小化它们的方差,\(n\leq 50000\). 解 感觉以前写的太乱了,补一篇可以供快速阅读的题解 ...

  2. Laravel5.5添加新路由文件并制定规则

    Laravel5.5里面有4个默认的路由文件,其中web.php是默认路由文件,如果需要添加其他路由文件,按照以下步骤进行. 此处以添加网站home前端路由举例,我已经先在/app/Http/Cont ...

  3. Vue学习笔记【20】——Vue中的动画(使用动画钩子函数)

    定义及使用钩子函数 定义 transition 组件以及三个钩子函数:  <div id="app">    <input type="button&q ...

  4. Kubernetes 弹性伸缩HPA功能增强Advanced Horizontal Pod Autoscaler -介绍部署篇

    背景 WHAT(做什么) Advanced Horizontal Pod Autoscaler(简称:AHPA)是kubernetes中HPA的功能增强. 在兼容原生HPA功能基础上,增加预测.执行模 ...

  5. bzoj 2084

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2084 这道题很容易想到就是一个变种的最长回文字串, 不过回文的规则变成了s[i + p[i] ...

  6. 简单的使用Qt的QCustomplot画图

    一.新建一个widget工程 二.将Qcustomplot文件复制到项目下 三.右键qt项目增加已存在的文件 四.在.pro中添加 QT += widgets printsupport 五.在.h中添 ...

  7. Java中连接MySql数据库的例子

    Java中连接MySql数据库的例子: package com.joinmysql.demo; import java.sql.DriverManager; import java.sql.Resul ...

  8. 思维+multiset优化——cf1249E

    正着想很难,但是反着想就容易有思路 /* 将问题转化为 挑选最多的线段,每个点的覆盖次数不超过k次 multiset里存k个右端点,表示第i层当前的最远右端点,每次来一根新线段,能填就填进并更新,不能 ...

  9. noip历年试题

      noip2018 铺设道路 货币系统 赛道修建 一眼贪心.随便实现. 旅行 环套树枚举删除环上哪条边. 填数游戏 找规律,这谁会啊. 保卫王国 动态Dp,去问这位神仙.   noip2017 小凯 ...

  10. windows server2012r2 安装NET Framework 3.5

    在Windows Server 2012上安装一些软件,比如Oracle 11g等,经常会出现下面这样的错误:“无法安装一下功能:.NET Framework 3.5(包括.NET 2.0和3.0)” ...