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. ...
随机推荐
- MySql数据库的常用命令
1.连接Mysql 连接本地的mysql数据库 : mysql -u root -p (回车之后会提示输入密码) 连接远程主机的mysql数据库 : 假设远程主机的IP为:110.110.1 ...
- WPF treeview扩展
记录一下工作中遇到的问题,以便以后忘记了可以来看. 在工作中遇到一个问题,就是要实现类型如下的界面,没有使用Telerik和Dev库.本来最开始是想使用Datagrid,但不知道怎么实现treevie ...
- 阿里云API网关(11)外网访问 阿里云API网关内定义的API步骤:
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...
- github入门:设置添加ssh key<转>
GitHub是个分布式的版本控制库.github通过git使用,可以方便的记录代码版本. 通过github可以学习优秀的代码,可以改进提交其他项目中的bug,借助社区力量促进软件优化完善. 国内外大量 ...
- Spark入门(1-5)Spark统一了TableView和GraphView
下面我们看一下图计算的简单示例: 从图我们可以看出, 拿到Wikipedia的文档后,我们可以: 1.Wikipedia的文档 -- > table视图 -- >分析Hyperlinks超 ...
- Python 自动化 第一周
1.Python简介 1.1.Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打发时 ...
- 详解k8s零停机滚动发布微服务 - kubernetes
1.前言 在当下微服务架构盛行的时代,用户希望应用程序时时刻刻都是可用,为了满足不断变化的新业务,需要不断升级更新应用程序,有时可能需要频繁的发布版本.实现"零停机"." ...
- 为什么Java不能以返回值区分重载方法?
读者可能会想:"在区分重载方法的时候,为什么只能以类名和方法的形参列表作为标准呢?能否考虑用方法的返回值来区分呢?" 比如下面两个方法,虽然他们有相同的名字和形式参数,但却很容易区 ...
- Windows10下的docker安装与入门 (二)使用docker引擎在容器中运行镜像
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...
- POJ-2570 Fiber Network---Floyd+二进制表示集合
题目链接: https://vjudge.net/problem/POJ-2570 题目大意: 一些公司决定搭建一个更快的网络,称为"光纤网".他们已经在全世界建立了许多站点,这 ...