GCD Counting-树形DP
思路: 预处理 每个权值的素因子。问题转化为 以同一个素数作为因子 最长的链,
树形DP求解,ans 由 此点的 最长子链 + 次长子链 相加得到, 然后再更新最长子链
#include<bits/stdc++.h>
using namespace std;
#define maxn 234567
int pri[maxn+10],n,a[maxn+10];
int x,y,dp[maxn+10][30],id,ans;
int head[maxn+10],cnt,sum[maxn];
vector<int>p[maxn+10];
bool isprime[maxn+10],flag;
struct node
{
int v,to;
} edge[maxn*2];
void add(int u,int v)
{
edge[++cnt].v=v;
edge[cnt].to=head[u];
head[u]=cnt;
}
void prime()
{
isprime[0]=isprime[1]=1;
for(int i=2; i<=sqrt(maxn); i++)
for(int j=i*i; j<maxn; j+=i)
isprime[j]=1;
for(int i=2; i<=maxn; i++)
if(isprime[i]==0)pri[++id]=i;
}
void dfs(int u,int fa)
{
for(int i=head[u]; i!=-1; i=edge[i].to)
{
int v=edge[i].v;
if(v==fa)continue;
dfs(v,u);
int len1=sum[u];
int len2=sum[v];
for(int j=0; j<len1; j++)
for(int k=0; k<len2; k++)
if(p[u][j]==p[v][k])
{
ans=max(ans,dp[u][j]+dp[v][k]+1);
dp[u][j]=max(dp[u][j],dp[v][k]+1);
}
}
}
int main()
{
prime();
memset(head,-1,sizeof(head));
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
if(a[i]==1)continue;
else flag=1;
for(int j=1; pri[j]<=a[i]&&j<=id; j++)
{
if(a[i]==1)break;
if(a[i]%pri[j]==0)
{
p[i].push_back(pri[j]);
sum[i]++;
}
while(a[i]%pri[j]==0)
a[i]/=pri[j];
if(isprime[a[i]]==0)
{
p[i].push_back(a[i]);
sum[i]++;
break;
}
}
}
for(int i=1; i<n; i++)
{
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
if(!flag)printf("0\n");
else
{
dfs(1,0);
printf("%d\n",ans+1);
}
return 0;
}
GCD Counting-树形DP的更多相关文章
- CF EDU 1101D GCD Counting 树形DP + 质因子分解
CF EDU 1101D GCD Counting 题意 有一颗树,每个节点有一个值,问树上最长链的长度,要求链上的每个节点的GCD值大于1. 思路 由于每个数的质因子很少,题目的数据200000&l ...
- cf842C 树形dp+gcd函数
树形dp用一下就好了 /* dp[i]表示不删节点的gcd值 每个结点开个vector用来存储删一个点之后的最大值 然后排序 去重 */ #include<bits/stdc++.h> # ...
- CF1101D GCD Counting
题目地址:CF1101D GCD Counting zz的我比赛时以为是树剖或者点分治然后果断放弃了 这道题不能顺着做,而应该从答案入手反着想 由于一个数的质因子实在太少了,因此首先找到每个点的点权的 ...
- 「算法笔记」树形 DP
一.树形 DP 基础 又是一篇鸽了好久的文章--以下面这道题为例,介绍一下树形 DP 的一般过程. POJ 2342 Anniversary party 题目大意:有一家公司要举行一个聚会,一共有 \ ...
- HDU-4661 Message Passing 树形DP,排列组合
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4661 题意:有n个人呈树状结构,每个人知道一个独特的消息.每次可以让一个人将他所知的所有消息告诉和他相 ...
- BNUOJ-26482 Juice 树形DP
题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=26482 题意:给一颗树,根节点为送电站,可以无穷送电,其它节点为house,电量达到pi时 ...
- HDU-4679 Terrorist’s destroy 树形DP,维护
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4679 题意:给一颗树,每个边有一个权值,要你去掉一条边权值w剩下的两颗子树中分别的最长链a,b,使得w ...
- HDU-4616 Game 树形DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4616 比较典型的树形DP题目,f[u][j][k]表示以点u为子树,经过 j 个陷阱的最大值,其中k= ...
- Codeforces Round #551 (Div. 2) D. Serval and Rooted Tree (树形dp)
题目链接 题意:给你一个有根树,假设有k个叶子节点,你可以给每个叶子节点编个号,要求编号不重复且在1-k以内.然后根据节点的max,minmax,minmax,min信息更新节点的值,要求根节点的值最 ...
随机推荐
- Codeforces 1077D Cutting Out(二分答案)
题目链接:Cutting Out 题意:给定一个n长度的数字序列s,要求得到一个k长度的数字序列t,每次从s序列中删掉完整的序列t,求出能删次数最多的那个数字序列t. 题解:数字序列s先转换成不重复的 ...
- MDK填充FLASH为0xFF
title: MDK填充FLASH为0xFF date: 2019/1/3 20:34:05 --- MDK填充FLASH为0xFF 参考 area 指定地址 https://blog.csdn.ne ...
- crm 数据展示 和分页思想(一)
1. 数据的展示 数据通过ORM查询出来 对象列表 QuerySet 1. 普通的字段 对象.字段名 ——> 数据库中的值 <td>{{ customer.phone }}</ ...
- tex 进度条
\documentclass{beamer} \usepackage{tikz} \usetikzlibrary{calc} \definecolor{pbblue}{HTML}{0A75A8}% f ...
- [物理学与PDEs]第5章第5节 弹性动力学方程组及其数学结构
5.5.1 线性弹性动力学方程组 1. 线性弹性动力学方程组 $$\beex \bea 0&=\rho_0\cfrac{\p{\bf v}}{\p t}-\Div_x{\bf P}-\r ...
- oracle数据库驱动(ojdbc)
第1部分 Q:为什么oralce的jdbc驱动,在maven上搜索到把pom配置复制到pom.xml里进行引用的时候会报错? ANS:虽然能在maven仓库里搜索到,但貌似不能用,原因是oracle是 ...
- Win7 x64位打开VirtualBox报错处理。
错误代码如下: Failed to instantiate CLSID_VirtualBox w/ IVirtualBox, but CLSID_VirtualBox w/ IUnknown work ...
- 练习:javascript轮播图效果
javascript轮播自动播放切换滑过停止,上一页/下一页 <!DOCTYPE html> <html lang="en"> <head> & ...
- IN-子查询
为什么需要子查询? 现实中,很多情况需要进行以下条件的判断 集合成员资格 某一元素是否是某一个集合的成员 集合之间的比较 某一个集合是否包含另一个集合 集合基数的测试 测试集合是否为空 测试集合是否存 ...
- C# - 常用接口
常用接口 用于比较接口 IComparable<T> 接口内部定义了用于比较两个对象大小的CompareTo(T t)方法,>参数时返回1,=参数时返回0,<参数时返回-1.集 ...