hdu5468 Puzzled Elena
hdu5468 Puzzled Elena
题意
求一棵子树内与它互质的点个数
解法
容斥
我们先求出与它不互质的数的个数,再用总数减去就好。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
using namespace std;
namespace Input {
int a; char c; bool sign;
inline int geti() {
sign = false;
while ((c = getchar()) < '0' || c > '9') sign |= c == '-';
a = c - '0';
while ((c = getchar()) >= '0' && c <= '9') a = (a << 3) + (a << 1) + c - '0';
return sign ? -a : a;
}
}
const int N = 1e5 + 5;
vector<int> edge[N], Num[N], ty[N];
int Cnt[N], Val[N], ans[N], ch[N][70];
void init() {
memset(Cnt, 1, sizeof Cnt);
int i, j, cnt, len, t, k; cnt = 0;
for (i = 0; i < N; ++i) Num[i].clear(), ty[i].clear();
for (i = 2; i < N; ++i) {
if (Cnt[i]) {
for (j = i; j < N; j += i)
Cnt[j] = 0, Num[j].push_back(i), cnt += j == 4;
}
}
vector<int>tmp;
for (i = 2; i < N; ++i) {
tmp.clear();
for (j = 0; j < Num[i].size(); ++j)
tmp.push_back(Num[i][j]);
len = tmp.size(); Num[i].clear();
for (j = 1; j < (1 << len); ++j) {
cnt = 0, t = 1;
for (k = 0; k < len; ++k)
if (j & (1 << k)) {
++cnt; t *= tmp[k];
}
if (cnt & 1) ty[i].push_back(-1);
else ty[i].push_back(1);
Num[i].push_back(t);
}
}
}
int dfs(int u, int fa) {
int si = 0, va = Val[u], i, v;
for (i = 0; i < Num[va].size(); ++i)
ch[u][i] = Cnt[Num[va][i]];
for (i = 0; i < edge[u].size(); ++i) {
v = edge[u][i];
if (v == fa) continue;
si += dfs(v, u);
}
ans[u] = si;
for (i = 0; i < Num[va].size(); ++i)
ans[u] += Cnt[Num[va][i]] - ch[u][i];
for (i = 0; i < Num[va].size(); ++i)
Cnt[Num[va][i]] += ty[va][i];
if (va == 1) ++ans[u];
return si + 1;
}
int main() {
init();
int Case = 0, n, u, v, i;
while (scanf("%d", &n) ^ EOF) {
for (i = 1; i <= n; ++i) edge[i].clear();
for (i = 1; i < n; ++i) {
u = Input::geti(), v = Input::geti();
edge[u].push_back(v), edge[v].push_back(u);
}
memset(Cnt, 0, sizeof Cnt);
for (i = 1; i <= n; ++i) Val[i] = Input::geti();
dfs(1, 0);
printf("Case #%d:", ++Case);
for (i = 1; i <= n; ++i)
printf(" %d", ans[i]);
puts("");
}
return 0;
}
莫比乌斯反演
此题其实也可以用莫比乌斯反演做,不过其实与容斥差不多,因为mu[i]其实与ty[i]是一样的。
代码就不贴了,其实比较像。
hdu5468 Puzzled Elena的更多相关文章
- HDU 5468 Puzzled Elena
Puzzled Elena Time Limit: 2500ms Memory Limit: 131072KB This problem will be judged on HDU. Original ...
- 2015上海网络赛 A Puzzled Elena
题意:给定一棵树,求这个节点的所有子树中包括他本身与它互质的节点的个数. 解题思路:题利用dfs序+容斥原理+前缀和性质解决.题目中要求每个结点,和多少个它的子结点互素.如果每次为了求一个点去跑一遍d ...
- HDU 5468 Puzzled Elena (dfs + 莫比乌斯反演)
题意:给定一棵带权树,求每个点与其子树结点的权值互质的个数. 析:首先先要进行 dfs 遍历,len[i] 表示能够整除 i 的个数,在遍历的前和遍历后的差值就是子树的len值,有了这个值,就可以使用 ...
- HDU 5468 Puzzled Elena 莫比乌斯反演
题意: 给出一棵树,每个点上有权值.然后求每棵子树中与根节点互质( \(gcd(a, b) = 1\) )的节点个数. 分析: 对于一颗子树来说,设根节点的权值为\(u\), \(count_i\)表 ...
- HDU5468(dfs序+容斥原理)
Puzzled Elena Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- 2015 ACM/ICPC Asia Regional Shanghai Online
1001 Puzzled Elena 1002 Antonidas 1003 Typewriter 1004 Count the Grid 1005 Code Formatting 1006 Ther ...
- hdu 5468(莫比乌斯+搜索)
hdu 5468 Puzzled Elena /*快速通道*/ Sample Input 5 1 2 1 3 2 4 2 5 6 2 3 4 5 Sample Output Case #1: ...
- hdu 5468(dfs序+容斥原理)
Puzzled Elena Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- 前言|Elena
2019.3.19更新置顶 2018.11.5更新置顶 2018.9.7更新置顶 -这里写下置顶- 嗨嗨嗨 这里AlenaNuna,偏远小渔村oi蒟蒻一只,各大题库id有Elena/AlenaNuna ...
随机推荐
- shell实现SSH自动登陆
h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h ...
- centos 进度条卡死
CentOS 6.7 系统 在执行完删除更新包的全部操作之后, yum remove -y Deployment_Guide-en-US finger cups-libs cups ypbind &a ...
- Linux的主机规划和磁盘分区
选择与Linux搭配的主机配置 CPU 只要不是老旧到让你的硬件系统死机的都能够支持 RAM 内存越大越好,内存的重要性要比CPU还要高,至少512MB Hard Disk 由于数据量与数据的访问频 ...
- Dan Zhang - Visual Studio ALM MVP
I am a Microsoft Certified Partner specialising in .NET solutions, also worked as an ALM consultant. ...
- 基于ionic+cordova+angularJs从零开始搭建自己的移动端H5 APP
这里详细介绍下如何用ionic+cordova+angularjs搭建自己的移动端app,包括环境搭建,框架使用等,具体项目已放置在github上,可下载下来自行启动. 下载地址:https://gi ...
- P1774 最接近神的人_NOI导刊2010[树状数组 逆序对 离散化]
题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的殿堂”.小FF猜想里面应该就有王室的 ...
- 洛谷P1341 无序字母对[无向图欧拉路]
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...
- Spring远程调用技术<1>-RMI
在java中,我们有多种可以使用的远程调用技术 1.远程方法调用(remote method invocation, RMI) 适用场景:不考虑网络限制时(例如防火墙),访问/发布基于java的服务 ...
- Winform无边框窗体的移动和阴影
//窗体移动API [DllImport("user32.dll")] public static extern bool ReleaseCapture(); [DllImport ...
- 操作系统IO模型
操作系统IO模型 声明:如下内容是根据APUE和mycat两本著作中关于I/O模式的一些内容加上自己的一些理解整理而成,仅供学习使用. 本节内容 UNIX下可用的五种I/O模型 三种I/O模型 Rea ...