hdu 5468(莫比乌斯+搜索)
hdu 5468 Puzzled Elena /*快速通道*/
Sample Input
1 2
1 3
2 4
2 5
6 2 3 4 5
Sample Output
题意:在一棵树上,每个节点有值,求以x为根节点的树中,有多少与根节点互质
思路:
用num[i]记录节点中包含因子i的个数,然后搜索到当前根节点时,我们先记录下在此之前的num,然后遍历返回后,
计算num的差值,利用莫比乌斯原理,先ans记录树中所有的节点数,然后该加的加,该减的减。
莫比乌斯不清楚的话可以翻翻前面的文章。
参考以下大大博文:
- /*
- 如果互质,找出子树中包含val[cur]的因子的数,假设为6,则减去约数中含有2,3的
- 但是会重复减去含有6的,所以应该在加上含6的数
- 于是满足了莫比乌斯函数,合数为0,含奇数个质数为-1,含偶数个质数为1
- 感觉特别适合容斥原理。
- 对于dfs序:/*并不了解,也可以做的
- 将树展现在数组上。
- void DFS(int u, int fa)
- {
- dfn ++;
- seq[dfn] = u;
- for(int i = HEAD[u]; i != -1; i = E[i].next)
- {
- int v = E[i].to;
- if(v != fa)
- DFS(v, u);
- }
- dfn ++;
- seq[dfn] = -u;
- }
- 参考:
- AOQNRMGYXLMV:http://www.cnblogs.com/AOQNRMGYXLMV/p/4858452.html
- Tc_To_Top:http://blog.csdn.net/tc_to_top/article/details/48802683
- */
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <cstdlib>
- #include <queue>
- #include <vector>
- #include <algorithm>
- #include <functional>
- typedef long long ll;
- using namespace std;
- const int inf = 0x3f3f3f3f;
- const int maxn = 100000;
- int is_prime[maxn+10];
- int prime[maxn+10];
- int mu[maxn+10];
- int snum[maxn+10];
- vector<int> fac[maxn + 10];
- vector<int> F[maxn+10];
- int tot;
- void Moblus()
- {
- tot = 0;
- memset(is_prime,0,sizeof(is_prime));
- mu[1] = 1;
- for(int i = 2; i <= maxn; i++)
- {
- if(!is_prime[i])
- {
- prime[tot++] = i;
- mu[i] = -1;
- }
- for(int j = 0; j < tot; j++)
- {
- if(prime[j]*i>maxn)
- break;
- is_prime[i*prime[j]] = 1;
- if(i % prime[j])
- {
- mu[i*prime[j]] = -mu[i];
- }
- else
- {
- mu[i*prime[j]] = 0;
- break;
- }
- }
- }
- for(int i = 2; i <= maxn; i++)
- {
- if(mu[i])
- for(int j = i; j <= maxn; j+=i)
- fac[j].push_back(i);
- }
- }
- int val[maxn],num[maxn],ans[maxn];
- void dfs(int cur,int par)
- {
- snum[cur] = 1;
- vector<int>tt;
- for(int i = 0; i<fac[val[cur]].size(); i++)
- {
- int v = fac[val[cur]][i];
- tt.push_back(num[v]);
- num[v]++;
- }
- for(int i = 0; i < F[cur].size(); i++)
- {
- int v = F[cur][i];
- if(v == par)
- continue;
- dfs(v,cur);
- snum[cur] += snum[v];
- }
- ans[cur] = snum[cur];
- for(int i = 0; i<fac[val[cur]].size(); i++)
- {
- int v = fac[val[cur]][i];
- int c = num[v]-tt[i];
- if(c)
- ans[cur] += mu[v]*c;
- }
- }
- void ini()
- {
- tot= 0;
- memset(ans,0,sizeof(ans));
- memset(num,0,sizeof(num));
- //memset(head,-1,sizeof(head));
- }
- int main()
- {
- int n;
- Moblus();
- int cas = 1,a,b;
- while(scanf("%d",&n) != EOF)
- {
- ini();
- for(int i = 0;i <= n;i++)
- F[i].clear();
- for(int i = 0; i <n-1; i++)
- {
- scanf("%d%d",&a,&b);
- F[a].push_back(b);
- F[b].push_back(a);
- }
- for(int i = 1 ; i <= n; i++)
- scanf("%d",&val[i]);
- dfs(1,0);
- printf("Case #%d:",cas++);
- for(int i = 1; i <= n; i++)
- {
- printf(" %d",ans[i]);
- }
- printf("\n");
- }
- return 0;
- }
hdu 5468(莫比乌斯+搜索)的更多相关文章
- HDU 5468 Puzzled Elena 莫比乌斯反演
题意: 给出一棵树,每个点上有权值.然后求每棵子树中与根节点互质( \(gcd(a, b) = 1\) )的节点个数. 分析: 对于一颗子树来说,设根节点的权值为\(u\), \(count_i\)表 ...
- HDU 5468 Puzzled Elena (dfs + 莫比乌斯反演)
题意:给定一棵带权树,求每个点与其子树结点的权值互质的个数. 析:首先先要进行 dfs 遍历,len[i] 表示能够整除 i 的个数,在遍历的前和遍历后的差值就是子树的len值,有了这个值,就可以使用 ...
- HDU 5468 Puzzled Elena
Puzzled Elena Time Limit: 2500ms Memory Limit: 131072KB This problem will be judged on HDU. Original ...
- HDU 4499.Cannon 搜索
Cannon Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Subm ...
- HDU 1045 (DFS搜索)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1045 题目大意:在不是X的地方放O,所有O在没有隔板情况下不能对视(横行和数列),问最多可以放多少个 ...
- HDU 1180 (BFS搜索)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1180 题目大意:迷宫中有一堆楼梯,楼梯横竖变化.这些楼梯在奇数时间会变成相反状态,通过楼梯会顺便到达 ...
- HDU 2531 (BFS搜索)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2531 题目大意: 你的身体占据多个点.每次移动全部的点,不能撞到障碍点,问撞到目标点块(多个点)的最 ...
- HDU 1026 (BFS搜索+优先队列+记录方案)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1026 题目大意:最短时间内出迷宫.迷宫里要杀怪,每个怪有一定HP,也就是说要耗一定时.输出方案. 解 ...
- HDU 1312 (BFS搜索模板题)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1312 题目大意:问迷宫中有多少个点被访问. 解题思路: DFS肯定能水过去的.这里就拍了一下BFS. ...
随机推荐
- [译]RabbitMQ教程C#版 - 工作队列
先决条件 本教程假定RabbitMQ已经安装,并运行在localhost标准端口(5672).如果你使用不同的主机.端口或证书,则需要调整连接设置. 从哪里获得帮助 如果您在阅读本教程时遇到困难,可以 ...
- 关于团购VPS的事情报告
作者 玄魂 2017-08-11 玄魂工作室-玄魂 玄魂工作室首先要抱歉,之前的说的继续组织大家购买vps的事情,不会再组织了.原因有以下几个:1)因为人多,需求各不相同,不好协调.2)服务都是购 ...
- Python内置函数(56)——locals
英文文档: locals() Update and return a dictionary representing the current local symbol table. Free var ...
- Linux CentOS7.0 (02)修改主机名和ip地址
一.主机名修改 1.查看命令 在CentOS中,有三种定义的主机名:静态的(static),瞬态的(transient),和灵活的(pretty). "静态"主机名也称为内核主机名 ...
- GIT入门笔记(7)- 修改文件并向版本库提交
1.修改文件vi readme.txt git status 发现被修改的文件列表git diff readme.txt 2.git add readme.txt git status --注意gi ...
- maven入门(9)Maven常用命令
Maven常用命令 清理 clean编译 compile打包 package安装 install跳过测试 clean package -Dmaven.test.skip=true
- 使用 C#/.NET Core 实现单体设计模式
本文的概念内容来自深入浅出设计模式一书 由于我在给公司做内培, 所以最近天天写设计模式的文章.... 单体模式 Singleton 单体模式的目标就是只创建一个实例. 实际中有很多种对象我们可能只需要 ...
- format的应用
>>> "{a} love {b}.{c}".format(a="I", b="Fish", c="com&qu ...
- Text-插入图片
#text插入图片 from tkinter import * master=Tk() text=Text(master,width=50,height=50) text.pack() photo=P ...
- 微信小程序:模板消息推送提示{“errcode”:41030,”errmsg”:”invalid page hint: [gP1eXXXXXX]”}
在开发小程序 模板消息定时推送功能时,在开发版测试程序功能运行正常,但提交到线上后提示报错{“errcode”:41030,”errmsg”:”invalid page hint: [gP1eXXXX ...