dfs遍历树+莫比乌斯反演..

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;const int maxn = 100005;
const int maxm = 200005;struct Edge
{int v;Edge *next;
}E[maxm], *H[maxn], *edges;int not_prime[maxn];
int prime[maxn];
int mu[maxn];
int p_cnt;vector<int> vec[maxn], v[maxn];
int cnt[maxn];
int res[maxn];
int a[maxn];
int n;void Init()
{mu[1] = 1;p_cnt = 0;for(int i = 2; i < maxn; i++) {if(!not_prime[i]) {prime[p_cnt++] = i;mu[i] = -1;}for(int j = 0; j < p_cnt && i * prime[j] < maxn; j++) {not_prime[i * prime[j]] = 1;if(i % prime[j]) mu[i * prime[j]] = -mu[i];else {mu[i * prime[j]] = 0;break;}}}
}void init()
{edges = E;memset(H, 0, sizeof H);memset(cnt, 0, sizeof cnt);memset(res, 0, sizeof res);
}void addedges(int u, int v)
{edges->v = v;edges->next = H[u];H[u] = edges++;
}int calc(int u)
{int ans = 0;for(int i = 0; i < vec[u].size(); i++) {int d = vec[u][i];ans += cnt[d] * mu[d];}return ans;
}void dfs(int u, int fa)
{res[u] -= calc(u);for(int i = 0; i < vec[u].size(); i++) {int d = vec[u][i];cnt[d]++;}for(Edge *e = H[u]; e; e = e->next) if(e->v != fa) dfs(e->v, u);res[u] += calc(u);
}void work()
{for(int i = 1; i < n; i++) {int u, v;scanf("%d%d", &u, &v);addedges(u, v);addedges(v, u);}for(int i = 1; i <= n; i++) scanf("%d", &a[i]);for(int i = 1; i <= n; i++) vec[i] = v[a[i]];dfs(1, 1);for(int i = 1; i <= n; i++) printf("%d%c", res[i], i == n ? '\n' : ' ');
}int main()
{Init();int _ = 0;for(int i = 1; i < maxn; i++)for(int j = i; j < maxn; j += i)v[j].push_back(i);while(scanf("%d", &n) != EOF) {printf("Case #%d: ", ++_);init();work();}return 0;
}

mobius HDOJ 5468 Puzzled Elena相关推荐

  1. hdu 5468 Puzzled Elena(前缀性质+dfs序+容斥)

    题目链接:hdu 5468 Puzzled Elena 解题思路 预处理出每个数的因子(注意只需要质因子幂数最大为1的数,例如6=21∗316=2^1 * 3^1)然后用一个数组维护,fac[i]表示 ...

  2. 【HDU】5468 Puzzled Elena

    Puzzled Elena 题目链接 Puzzled Elena 题目大意 给你一棵树,n个节点n-1条边,每个节点都有一个权值.现在让你求每个节点的子树下面有多少个节点与该节点互质. 题解 容斥原理 ...

  3. HDU 5468 Puzzled Elena(2015 ACM/ICPC Asia Regional Shanghai Online)

    题目大意 这道题要求出每个节点与其子树节点中有多少个节点互质,题目是这样,但是如果你认为真的是这样那就错了,因为有可能根节点是1,那么1与本身也是互质的!!其实我真的搞不懂,说好了与子树互质为什么就把 ...

  4. hdu 5468 Puzzled Elena

    一颗大小为(n<=100000) 的树,根为1,每个节点有个权值.问:每个节点 和 以这个节点为根的子树中 有多少权值和根的权值互质. 做法,我们首先要明白一个东西,就是当你已经知道了k个数,并 ...

  5. HDU - 5468 Puzzled Elena —— 容斥

    题意: 每个点的子树上有几个节点与该节点的权值互质 思路: 首先要明白怎么求一个集合中有多少个数与n互素 将集合中的数用算术基本定理分解,记录每个数能形成的所有因子的个数,然后将n分解进行容斥,可以求 ...

  6. HDU - 5468 Puzzled Elena (容斥/莫比乌斯)

    做了好几个容斥了,一直找不到feel,这个做完在现在有一点感觉了.虽然刚开始也不会.但就是发现感觉不一样了. 首先,不考虑树的关系,单纯给出一个m,还有一个集合(里面数字任意),求集合里面跟m互质的数 ...

  7. HDU 5468 Puzzled Elena 莫比乌斯反演

    题意: 给出一棵树,每个点上有权值.然后求每棵子树中与根节点互质( \(gcd(a, b) = 1\) )的节点个数. 分析: 对于一颗子树来说,设根节点的权值为\(u\), \(count_i\)表 ...

  8. hdu5468 Puzzled Elena

    hdu5468 Puzzled Elena 题意 求一棵子树内与它互质的点个数 解法 容斥 我们先求出与它不互质的数的个数,再用总数减去就好. #include <cstdio> #inc ...

  9. Puzzled Elena

    Puzzled Elena . . 题意:给定一棵树,1为根节点,问每个节点的子树有多少个与他互质的数. . . 解法:DFS序加容斥原理(莫比乌斯),DFS时用一个全局数组记录,count[i] 表 ...

最新文章

  1. 【VMC实验室】在QCloud上创建您的SQL Cluster(1)
  2. R绘制带显著性标记的热图
  3. jvm性能调优 - 08什么情况下对象会被GC
  4. Linux之Sed详解
  5. nova 命令汇总三 ——网络相关命令
  6. Django 应用程序 + 模型 + 基本数据访问
  7. 三款在线css3样式生成工具
  8. linux时间界面返回,Android开发教程:游戏过程中按Home键后返回游戏界面
  9. python安装步骤-从0到1,Python安装步骤详解(附基础知识简介)!
  10. VB二维码生成与解码的代码,特别支持中文的二维码编码译码
  11. H5调用摄像头拍照保存到服务器再把路径存到数据库中
  12. powerpoint ppt 点击放映后黑屏 解决办法
  13. 智能优化算法:共生生物搜索算法 - 附代码
  14. 2021-09-09md
  15. Mac OS X使用技巧汇总页面
  16. 简单爬虫--爬取百度热点新闻标题
  17. 生活,平淡,些许沉思,些许感概
  18. ARM简单程序设计【嵌入式系统】
  19. [个人笔记][遗传算法] 遗传算法的python实现
  20. 莫烦python pytorch_[莫烦 PyTorch 系列教程] 1.2 – 安装 PyTorch

热门文章

  1. Unity部分属性面板解说
  2. 互联网培训班是否值得参加
  3. 深度学习-推荐系统 研读第一章(作者:王喆)
  4. 工控(工业)主板如何选型?
  5. RAD STUDIO (c++ builder)下配置BOOST库
  6. 恢复丢失的VMFS分区-适用于esxi5
  7. 2020年的总结和2021的目标
  8. 【OpenCV】数字图像的距离变换算法
  9. 方案分享--直驱式风力发电实验仿真平台
  10. chrome浏览器安装markdown浏览插件