HDU 5468 Puzzled Elena 莫比乌斯反演
题意:
给出一棵树,每个点上有权值.然后求每棵子树中与根节点互质( \(gcd(a, b) = 1\) )的节点个数.
分析:
对于一颗子树来说,设根节点的权值为\(u\), \(count_i\)表示权值为\(i\)的倍数的节点的个数.
那么根据莫比乌斯反演,与\(u\)互质的节点的个数为\(\sum_{d|u}\mu(d)count_d\)
所以,我们记录一下遍历子树之前的\(count\)值和遍历子树之后的\(count\)值,作差就是这棵子树的\(count\)值
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn = 100000;
int mu[maxn + 10], pcnt, prime[maxn];
bool vis[maxn + 10];
vector<int> factors[maxn + 10];
vector<int> G[maxn + 10];
void preprocess() {
pcnt = 0;
mu[1] = 1;
for(int i = 2; i <= maxn; i++) {
if(!vis[i]) {
mu[i] = -1;
prime[pcnt++] = i;
}
for(int j = 0; j < pcnt && i * prime[j] <= maxn; j++) {
vis[i * prime[j]] = true;
if(i % prime[j] != 0) 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) factors[j].push_back(i);
}
int val[maxn + 10];
int n;
int cnt[maxn], sz[maxn], ans[maxn];
void dfs(int u, int fa) {
sz[u] = 1;
vector<int> pre;
for(int d : factors[val[u]]) {
pre.push_back(cnt[d]);
cnt[d]++;
}
for(int v : G[u]) {
if(v == fa) continue;
dfs(v, u);
sz[u] += sz[v];
}
ans[u] = sz[u];
for(int i = 0; i < factors[val[u]].size(); i++) {
int d = factors[val[u]][i];
int c = cnt[d] - pre[i];
if(c) ans[u] += mu[d] * c;
}
}
int main()
{
preprocess();
int kase = 1;
while(scanf("%d", &n) == 1 && n) {
for(int i = 1; i <= n; i++) G[i].clear();
for(int u, v, i = 1; i < n; i++) {
scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
for(int i = 1; i <= n; i++) scanf("%d", val + i);
memset(cnt, 0, sizeof(cnt));
dfs(1, 0);
printf("Case #%d:", kase++);
for(int i = 1; i <= n; i++) printf(" %d", ans[i]);
printf("\n");
}
return 0;
}
HDU 5468 Puzzled Elena 莫比乌斯反演的更多相关文章
- HDU 5468 Puzzled Elena
Puzzled Elena Time Limit: 2500ms Memory Limit: 131072KB This problem will be judged on HDU. Original ...
- HDU 5468 Puzzled Elena (dfs + 莫比乌斯反演)
题意:给定一棵带权树,求每个点与其子树结点的权值互质的个数. 析:首先先要进行 dfs 遍历,len[i] 表示能够整除 i 的个数,在遍历的前和遍历后的差值就是子树的len值,有了这个值,就可以使用 ...
- HDU 5321 Beautiful Set (莫比乌斯反演 + 逆元 + 组合数学)
题意:给定一个 n 个数的集合,然后让你求两个值, 1.是将这个集合的数进行全排列后的每个区间的gcd之和. 2.是求这个集合的所有的子集的gcd乘以子集大小的和. 析:对于先求出len,len[i] ...
- HDU 4746 Mophues【莫比乌斯反演】
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4746 题意: 1≤x,y≤n , 求gcd(x,y)分解后质因数个数小于等k的(x,y)的对数. 分 ...
- HDU 1695 GCD (莫比乌斯反演)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDU 1695 GCD (莫比乌斯反演模板)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- hdu 1695 容斥原理或莫比乌斯反演
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- hdu 1695: GCD 【莫比乌斯反演】
题目链接 这题求[1,n],[1,m]gcd为k的对数.而且没有顺序. 设F(n)为公约数为n的组数个数 f(n)为最大公约数为n的组数个数 然后在纸上手动验一下F(n)和f(n)的关系,直接套公式就 ...
- HDU 5608 function(莫比乌斯反演 + 杜教筛)题解
题意: 已知\(N^2-3N+2=\sum_{d|N}f(d)\),求\(\sum_{i=1}^nf(i) \mod 1e9+7\),\(n\leq1e9\) 思路: 杜教筛基础题? 很显然这里已经设 ...
随机推荐
- 关于使用memcached提高并发的文章,很有用
http://blog.csdn.net/ywh147/article/details/9385137 http://phl.iteye.com/category/292555 memcached 解 ...
- Java 面向对象,封装,继承
1相关概念的理解 1.1面向过程.面向对象 面向过程与面向对象都是编程中,编写程序的一种思维方式. 面向过程的程序设计方式,是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程.(职员思想) 面向 ...
- 网页转PDF作为邮件附件
Nuget 引入 OpenHtmlToPdf using (WebClient wc = new WebClient()) { wc.Encoding = Encoding.UTF8; wc.UseD ...
- 【Android】ContentProvider
转载地址:http://www.cnblogs.com/lqminn/archive/2012/10/16/2725624.html 一.ContentProvider的概念 ContentProvi ...
- Android 调节图片工具类
package com.base.changeimage; import android.graphics.Bitmap; import android.graphics.Canvas; import ...
- pc端常见布局---垂直居中布局 单元素不定高
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- python爬虫之路——初识爬虫三大库,requests,lxml,beautiful.
三大库:requests,lxml,beautifulSoup. Request库作用:请求网站获取网页数据. get()的基本使用方法 #导入库 import requests #向网站发送请求,获 ...
- uva10129 PlayOnWords(并查集,欧拉回路)
判断无向图是否存在欧拉回路,就是看度数为奇数的点有多少个,如果有两个,那么以那分别两个点为起点和终点,可以构造出一条欧拉回路,如果没有,就任意来,否则,欧拉回路不存在. 首先用并查集判断连通,然后统计 ...
- php循环a-z字母表
ord — 返回字符的 ASCII 码值 说明 int ord ( string $string ) 返回字符串 string 第一个字符的 ASCII 码值. 该函数是 chr() 的互补函数. ...
- 2018.3.3 多线程中继承Thread 和实现Runnable接口 的比较(通过售票案例来分析)
多线程中继承Thread 和实现Runnable接口 的比较(通过售票案例来分析) 通过Thread来实现 Test.java package com.lanqiao.demo4; public cl ...