hdu5468 Puzzled Elena(容斥原理+dfs序)
hdu5468
题目
给一棵树,每个结点有一个值,现在求以每个结点为根的子树中与其互质的结点的个数
思路
这位博主讲的很好http://www.cnblogs.com/program-ccc/p/5813771.html
首先我们是可以用容斥求出集合中不互素的元素个数,用总个数减一下就行了。
具体就是:①将元素进行质因数分解。②将质因数可能产生的乘积的出现次数加1。最后利用容斥原理求解。见代码。
用到的遍历是后序遍历,所以要先求出未进入该节点子节点时的不互素的数的个数,也就是与父节点其他子节点的不互素的个数,再在遍历完当前节点子节点后再求一次总数再相减就是当前节点子节点的情况。
对我来说:有了一个容斥的模版。
容斥原理在OJ中常解决两个典型问题:①求S中有多少个数与x不互素。②求1~m中有多少个数与n不互素。
代码
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#include <cstdio>using namespace std;typedef long long ll;
const int maxn=100010;vector<int>prime[maxn];
int cnt[maxn],res[maxn];
int head[maxn],tot,n,val[maxn];struct node
{int next;int to;
} edge[maxn*2];void addedge(int from,int to)
{edge[tot].to=to;edge[tot].next=head[from];head[from]=tot++;
}void init()
{for(int e=2; e<maxn; e++){if(!prime[e].size())for(int i=e; i<maxn; i+=e){prime[i].push_back(e);}}
}int cal(int n,int type)
{int ans=0;for(ll mark=1; mark<(1<<prime[n].size()); mark++){ll odd=0;ll mul=1;for(ll i=0; i<prime[n].size(); i++){if(mark&(1<<i)){odd++;mul*=prime[n][i];}}if(odd&1) ans+=cnt[mul];else ans-=cnt[mul];cnt[mul]+=type;}return ans;
}int dfs(int u,int fa)
{int s=0;int pre=cal(val[u],0);for(int i=head[u]; ~i; i=edge[i].next){int v=edge[i].to;if(v==fa) continue;s+=dfs(v,u);}int post=cal(val[u],1);res[u]=s-(post-pre);if(val[u]==1) res[u]++;return s+1;}int main()
{init();int kase=1;while(scanf("%d",&n)!=EOF){memset(head,-1,sizeof(head));memset(cnt,0,sizeof(cnt));tot=0;for(int i=1; i<n; i++){int u,v;scanf("%d %d",&u,&v);addedge(u,v);addedge(v,u);}for(int i=1; i<=n; i++)scanf("%d",&val[i]);dfs(1,-1);printf("Case #%d: ",kase++);for(int i=1; i<n; i++){printf("%d ",res[i]);}printf("%d\n",res[n-1]);}return 0;
}
hdu5468 Puzzled Elena(容斥原理+dfs序)相关推荐
- hdu 5468 Puzzled Elena(前缀性质+dfs序+容斥)
题目链接:hdu 5468 Puzzled Elena 解题思路 预处理出每个数的因子(注意只需要质因子幂数最大为1的数,例如6=21∗316=2^1 * 3^1)然后用一个数组维护,fac[i]表示 ...
- hdu5468 Puzzled Elena
hdu5468 Puzzled Elena 题意 求一棵子树内与它互质的点个数 解法 容斥 我们先求出与它不互质的数的个数,再用总数减去就好. #include <cstdio> #inc ...
- hdu5468 Puzzled Elena(容斥 莫比乌斯反演)
hdu5468 Puzzled Elena 题意 求一棵子树内与它互质的点个数 解法 容斥 我们先求出与它不互质的数的个数,再用总数减去就好. #include <cstdio> #inc ...
- 【HDU - 5468】Puzzled Elena(容斥原理,dfs序,数学,素因子分解,有坑)
题干: Problem Description Since both Stefan and Damon fell in love with Elena, and it was really diffi ...
- Puzzled Elena
Puzzled Elena . . 题意:给定一棵树,1为根节点,问每个节点的子树有多少个与他互质的数. . . 解法:DFS序加容斥原理(莫比乌斯),DFS时用一个全局数组记录,count[i] 表 ...
- 【HDU】5468 Puzzled Elena
Puzzled Elena 题目链接 Puzzled Elena 题目大意 给你一棵树,n个节点n-1条边,每个节点都有一个权值.现在让你求每个节点的子树下面有多少个节点与该节点互质. 题解 容斥原理 ...
- 2015上海网络赛 A Puzzled Elena
题意:给定一棵树,求这个节点的所有子树中包括他本身与它互质的节点的个数. 解题思路:题利用dfs序+容斥原理+前缀和性质解决.题目中要求每个结点,和多少个它的子结点互素.如果每次为了求一个点去跑一遍d ...
- 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组
[BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...
- A and B and Lecture Rooms CodeForces - 519E LCA+dfs序
看到这个题的第一个思路就是就是统计以每一个点为根的所有节点个数,然后具体就分情况讨论一下即可. 因为刚刚学习了dfs序,这个题就用了dfs序来通过进出时间戳来相减表示其为根的子节点个数. 分情况 我们 ...
最新文章
- WebJars 进行 css js 资源文件管理
- 剑指offer:扑克牌的顺子问题
- 数据库系统概念总结:第一章 引言
- PyCharm出现module ‘matplotlib’ has no attribute ‘verbose问题
- 设计洪水位与校核洪水位
- 申请美国博士后的经验
- java volatile 原子性_Java中volatile不能保证原子性的证明
- Color Cube – 国产的优秀配色取色工具
- c++用化简命题逻辑公式的方法设计一个5人表决开关电路,要求3人以上(含3人)同意则表决通过
- c#html转换pdf,[C#] 网页Html转PDF档(一行程式码解决)
- Python习题——2018-03-28作业
- 电信路由器用linux开发板,WRTnode: WRTnode是基于家用无线路由器芯片的开源Linux开发板,想法源于我之前的项目和产业经验...
- 2022-03-27 screenX和clientX的区别以及offsetX和pageX的区别
- (转)【mysql元数据库】使用information_schema.tables查询数据库和数据表信息 ---数据记录大小统计...
- ImageMagick将多张图片拼接成一张图片_今天才发现,微信按下“这个”按钮,能将手机里的照片拼接成长图...
- 联通光猫HG2543C1改桥接备忘
- 学会这三款软件,可以轻松完成录音转文字操作
- HTML视频学习教程,让你实战入门前端
- Codeforces 1106F Lunar New Year and a Recursive Sequence 矩阵快速幂,原根转化模意义下对数,BSGS
- 宁波市教育学院计算机系主任,欢迎宁波诺丁汉大学计算机系主任白瑞斌教授一行到访南科大...