传送门
思路:
直接上点分治+容斥计算每个因数对应的贡献即可。
代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int rlen=1<<18|1;
inline char gc(){static char buf[rlen],*ib,*ob;(ib==ob)&&(ob=(ib=buf)+fread(buf,1,rlen,stdin));return ib==ob?-1:*ib++;
}
inline int read(){int ans=0;char ch=gc();while(!isdigit(ch))ch=gc();while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=gc();return ans;
}
typedef long long ll;
const int N=1e5+5;
vector<int>e[N],fac[N],coe[N];
int n,a[N],lim=0,all,mx,siz[N],rt,Tim[N],cnt[N],mul[N],tim=0;
bool vis[N],chk[N];
ll ans=0;
inline int get(int x){if(mul[x])return mul[x];if(x<2)return mul[x]=x;int ret=1;for(ri i=0;i<fac[x].size();++i)ret*=fac[x][i];return mul[x]=ret;
}
inline void get_coef(int pos,int mul,int a){if(pos==fac[a].size()){if(~mul)coe[a].push_back(mul);return;}get_coef(pos+1,mul,a);get_coef(pos+1,-fac[a][pos]*mul,a);
}
inline void init(){for(ri i=2;i<=lim;++i)if(!vis[i])for(ri j=i;j<=lim;j+=i)vis[j]=1,fac[j].push_back(i);for(ri i=1,x;i<=n;++i)vis[i]=0,a[i]=get(a[i]);
}
void getroot(int p,int fa){siz[p]=1;int ms=0;for(ri i=0,v;i<e[p].size();++i){if((v=e[p][i])==fa||vis[v])continue;getroot(v,p),siz[p]+=siz[v],ms=max(ms,siz[v]);}ms=max(ms,all-siz[p]);if(ms<=mx)rt=p,mx=ms;
}
inline int query(int x){return Tim[x]==tim?cnt[x]:0;}
inline int ask(int x){int ret=0;if(!chk[x])get_coef(0,-1,x),chk[x]=1;for(ri i=0;i<coe[x].size();++i)ret+=coe[x][i]/abs(coe[x][i])*query(abs(coe[x][i]));return ret;
}
inline void update(int x){Tim[x]==tim?++cnt[x]:cnt[x]=1,Tim[x]=tim;}
inline void change(int x){if(!chk[x])get_coef(0,-1,x),chk[x]=1;for(ri i=0;i<coe[x].size();++i)update(abs(coe[x][i]));
}
inline int gcd(int a,int b){int t;while(b){t=a,a=b,b=t-t/a*a;}return a;}
void dfs(int p,int fa,int g,int coef){g=gcd(g,a[p]),ans+=coef*ask(g),change(g),siz[p]=1;for(ri i=0,v;i<e[p].size();++i){if(vis[v=e[p][i]]||v==fa)continue;dfs(v,p,g,coef),siz[p]+=siz[v];}
}
inline void solve(int p){vis[p]=1;++tim;change(a[p]);for(ri i=0,v;i<e[p].size();++i)if(!vis[v=e[p][i]])dfs(v,p,a[p],1);for(ri i=0,v;i<e[p].size();++i){if(vis[v=e[p][i]])continue;++tim,dfs(v,p,a[p],-1),mx=all=siz[v],getroot(v,p),solve(rt);}
}
int main(){n=read();for(ri i=1,u,v;i<n;++i)u=read(),v=read(),e[u].push_back(v),e[v].push_back(u);for(ri i=1;i<=n;++i)a[i]=read(),lim=max(lim,a[i]);init();rt=0,mx=all=n,getroot(1,0),solve(rt);cout<<(ll)n*(n-1)/2-ans;return 0;
}

转载于:https://www.cnblogs.com/ldxcaicai/p/10633597.html

2019.03.29 NOIP训练 友好国度(点分治+容斥)相关推荐

  1. 2019牛客国庆集训派对day2 K 2018(容斥)

    链接:https://ac.nowcoder.com/acm/contest/1107/K 来源:2019牛客国庆集训派对day2 题目描述   Given a, b, c, d, find out ...

  2. 2019.01.24 NOIP训练 旅行(轮廓线dp)

    传送门 题意简述: 给一个n∗mn*mn∗m的有障碍的网格图,问你从左上角走到左下角并覆盖所有可行格子的路径条数. 思路: 路径不是很好算. 将图改造一下,在最前面添两列,第一列全部能通过,第二列只有 ...

  3. jzoj6342-[NOIP2019模拟2019.9.7]Tiny Counting【树状数组,容斥】

    正题 题目大意 一个序列SSS,求有多少个互不相同的4元组(a,b,c,d)(a,b,c,d)(a,b,c,d)使得a<b且Sa<Sba<b且S_a<S_ba<b且Sa​ ...

  4. 2019牛客多校四 E. triples II (容斥)

    大意: 给定$n,a$, 求$n$个$3$的倍数, $or$和为$a$的方案数. 简单容斥题 可以求出$f_{x,y}$表示所有$3$的倍数中, 奇数位不超过$x$个$1$, 偶数位不超过$y$个$1 ...

  5. CSPS 2019 Day2 T1 Emiya 家今天的饭(容斥 + 计数 dp)

    Description 给定一个 n×mn \times mn×m 的矩阵,每一行最多选一个数,每一列可以选若干个数,但是每一列选的数不能超总数的一半.求有多少个不同的方案数. Solution 容斥 ...

  6. 2019年7月训练记录(更新ing)

    前言 本月上半月训练记录可详见:2019年暑假绍兴集训. \(Jul\ 15th\) 早上到机房先做了一道一直想做的板子题:[洛谷4781][模板]拉格朗日插值,发现拉格朗日插值也并没有想象中那么难. ...

  7. 《SRPG游戏开发》导航(2019.03.04更新)

    <SRPG游戏开发>导航 第一章到第五章并没有使用Markdown,且经过CSDN几次改版和取消目录,这几章排版有些怪怪的. 2019.03.04 第十一章(十 - 十二) ,间章 第十一 ...

  8. 第二次会议(2019/03/14)

    一.会议时间 2019年3月14日星期四 二.会议地点 逸夫楼C424 三.参与人员 Triple兔小组全体成员 四.会议内容 1.小组成员分别对自己的学习进度进行汇报 2.分析问卷调查结果 3.分配 ...

  9. Anaconda 2019.03 发布,Python 跨平台科学计算软件

    Python 科学计算包 Anaconda 发布 2019.03 版本,详细更新日志如下: 面向用户更改 conda与Windows Powershell完美集成. Windows Python包中包 ...

最新文章

  1. PCL点云特征描述与提取(3)
  2. Python使用tpot获取最优模型、将最优模型应用于交叉验证数据集(5折)获取数据集下的最优表现,并将每一折(fold)的预测结果、概率、属于哪一折与测试集标签、结果、概率一并整合输出为结果文件
  3. 总结ASP.NET中的各种弹窗
  4. 身份管理软件公司Okta计划IPO,目标融资1亿美元
  5. ZABBIX2.4.8监控 Windows Mysql数据库
  6. 使用securecrt在本地与服务器之间上传下载数据
  7. python刷题相关资料汇总(二)
  8. GDT蜘蛛侠 - 元搜索采集: 集成 百度,谷歌,搜搜,搜狗,有道 5大搜索引擎,其它可定制...
  9. js 一个对象的属性名是一个变量如何设置和获取值
  10. 前端菜鸟是这样入门学习的,点进来!
  11. 100天,Python从入门到精通!
  12. C语言判断素数(求素数)
  13. 八卦在计算机应用,计算机编程在八卦图研究中的应用.doc
  14. react--1.react环境搭建、JSX语法、注释、样式、列表渲染、定义单个组件、eact Props、react State
  15. P1397 [NOI2013] 矩阵游戏(矩阵乘法欧拉定理)
  16. 记录下XPO生成的SQL语句
  17. js 精确判断对象的类型
  18. Android av sync机制
  19. 噩梦的开始:动态规划之背包问题(01背包问题、完全背包问题、方案数填满型背包问题)
  20. 浅析大规模DDOS防御架构-应对T级攻防

热门文章

  1. spark 应用场景2-身高统计
  2. 2016.3.22(关系型数据库简介,管理数据库和表)
  3. php归档函数(按时间)实现
  4. UIButton return(textField textView)
  5. 关于VerifyError
  6. 如何判断网通、电信、铁通IP地址分配段
  7. 记录自己的nest学习之旅
  8. 06 事件处理函数绑定与事件对象
  9. python学习笔记第9天《文件的管理办法》
  10. (八)限定某个目录禁止解析php、限制user_agent和PHP相关配置