E. Kamil and Making a Stream

参考:Codeforces Round #588 (Div. 2)-E. Kamil and Making a Stream-求树上同一直径上两两节点之间gcd的和

思路:求的就是1~n之间所有最短路的gcd之和。

用一个set来储存每一个结点可能的gcd,另外再用一个三维的map来记录每一个结点的每一个gcd出现的次数。

代码:

// Created by CAD on 2019/9/28.
#include <bits/stdc++.h>
#define ll long long
using namespace std; const int maxn=1e5+5;
vector<int> g[maxn];
map<ll,ll> cnt[maxn];
set<ll> s[maxn];
ll x[maxn];
ll ans=0;
const int mod=1e9+7;
void dfs(int u,int f)
{
for(auto i:g[u])
{
if(i==f) continue;
for(auto v:s[u])
{
ll temp=__gcd(1ll*v,x[i]);
ans=(ans+1ll*temp%mod*cnt[u][v]%mod)%mod;
cnt[i][temp]+=cnt[u][v];
s[i].insert(temp);
}
s[i].insert(x[i]);
ans=(ans+x[i]%mod)%mod;
cnt[i][x[i]]++;
dfs(i,u);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin>>n;
for(int i=1;i<=n;++i)
cin>>x[i];
for(int i=1,u,v;i<=n-1;++i)
cin>>u>>v,g[u].push_back(v),g[v].push_back(u);
ans=(ans+x[1])%mod;
s[1].insert(x[1]);
cnt[1][x[1]]=1;
dfs(1,-1);
cout<<ans<<endl;
return 0;
}

最新文章

  1. 被误解的MVC和被神化的MVVM(转)
  2. SharePoint 2013技巧分享系列 - Active Directory同步显示用户照片
  3. sql查询工程结算分包款转出
  4. 《zw版&#183;Halcon-delphi系列原创教程》 Halcon分类函数001&#183;3D函数
  5. RabbitMQ介绍6 - 其它
  6. Linux 本地yum源搭建和网络yum源搭建
  7. [Leetcode][Python]50: Pow(x, n)
  8. IOS 学习笔记(1) 视图UIViewController
  9. win10系统下如何用命令行的方式打开画图软件
  10. BZOJ 2303: [Apio2011]方格染色 [并查集 数学!]
  11. SpringBoot开发案例之多任务并行+线程池处理
  12. 从Openvswitch代码看网络包的旅程
  13. spring揭秘 读书笔记 六 bean的一生
  14. BUGKU login3
  15. FMT 与 子集(逆)卷积
  16. js jquery 遍历 for,while,each,map,grep
  17. CentOS6.8下MySQL数据库忘记root密码解决方法
  18. 腾讯云Centos安装nginx
  19. BZOJ 2865 字符串识别 | 后缀数组 线段树
  20. fis前端开发框架

热门文章

  1. Android获取网络时间的方法
  2. 进阶Java编程(1)多线程编程
  3. node 环境安装
  4. Python(八) —— 异常(概念、捕获、传递、抛出)
  5. 题解 P2879 【[USACO07JAN]区间统计Tallest Cow】
  6. day1-css练习[新浪首页顶部栏]
  7. macbook打印出现乱码解决方案
  8. vue2中的keep-alive使用总结及注意事项
  9. 查看磁盘空间,Android各目录讲解
  10. 理解函数声明--signal函数的声明