题目描述

Mr. Walker 最近在研究树,尤其是最长树链问题。现在树中的每个点都有一个值,他想在树中找出最长的链,使得这条链上对应点的值的最大公约数不等于1。请求出这条最长的树链的长度。

输入格式

第一行一个整数 n,表示点的个数。

接下来 n−1 行,每行两个整数 x,y 表示 x,y 之间有边。

数据保证给出的是一棵树。

接下来一行 n 个整数表示每个点对应的权值 ai​。

输出格式

输出一个整数,表示这条树链的长度。

样例

样例输入

4

1 2

1 3

2 4

6 4 5 2

样例输出

3

数据范围与提示

n<=10^5,1<= ai<=10^9。

【题解】

做这类题一定要记住这句话:

没有暴力解决不了的题,只有不敢写暴力的人!

咳咳,所以说,这题的正解正是暴力。

读完题后,我们不难想到这样一个暴力:枚举每一个质数,权值是这个质数的倍数的节点设为1,最长链的长度就是点权为1的点构成的最长的链。

如果枚举所有质数,这题就会变成n*n,一定是A不了的,那怎么办呢?方法是这样的。

每个数最多只有log个不同的质因数,所以只要把所有点权质因数分解,枚举出现的质数就可以了。

我们枚举完质因数后dfs,因为每个点最多有log个不同的质因数,所以复杂度大概是O(能过)O(nlogn)。

【题外话】

这么写有一些小问题,如果质数极大就会T,Loj是能A的(数据真垃圾),但吕神的数据比较优秀,把我卡成了75.

这题告诉我:永远不要被数据吓到,也永远不要放弃一题,万一打个暴力能A呢?

下贴本蒟蒻丑陋的代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int N=;
int n,con,ans=,h[N],cnt,a[N],p[N],dis[N];
bool v[N];
struct
{
int nex,to;
}e[N<<]; void dfs(int u,int b,int c)
{
dis[u]=;
for(int i=h[u];i;i=e[i].nex)
if(e[i].to!=b && a[e[i].to]%c==)
{
while(a[e[i].to]%c==)
a[e[i].to]/=c;
dfs(e[i].to,u,c);
ans=max(ans,dis[u]+dis[e[i].to]+);
dis[u]=max(dis[u],dis[e[i].to]);
}
dis[u]++;
} void add(int u,int v)
{
cnt++;
e[cnt].nex=h[u];
e[cnt].to=v;
h[u]=cnt;
} int main()
{ scanf("%d",&n);
for(int i=;i*i<=;i++)
if(v[i]==)
{
for(int j=i*i;j<;j+=i) v[j]=;
}
for(int i=;i<=;i++)
if(v[i]==)
p[++con]=i;
for(int i=;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
for(int i=;i<=n;i++)
{
int s=a[i];
for(int j=;j<=con && p[j]*p[j]<=a[i];j++)
{
if(s%p[j]==)
{
while(s%p[j]==)
s/=p[j];
dfs(i,,p[j]);
}
}
if(s>)
dfs(i,,s);
a[i]=;
}
printf("%d",ans);
return ;
}

oi路漫漫,愿此题解能助你一臂之力......

最新文章

  1. 三款不错的图片压缩上传插件(webuploader+localResizeIMG4+LUploader)
  2. 6. web前端开发分享-css,js移动篇
  3. sqlalchemy中文乱码问题解决方案
  4. 阿里云安装JDK1.7
  5. 测试驱动开发(Test-Driven Development,简称TDD)--单元测试--&gt;提高代码质量
  6. Web Api其中的PUT功能演示
  7. 关于多线程情况下Net-SNMP v3 版本导致进程假死情况的跟踪与分析
  8. 用sass画蜗牛
  9. BZOJ 3653 谈笑风生
  10. 百度API_Demo
  11. 字体在Android View中的输出 drawText
  12. linux source命令学习
  13. mysql待整理
  14. Servlet的Request.getInputStream()只能读取一次问题
  15. 写一个MyList
  16. mybatis 的一点问题
  17. EFCore Lazy Loading + Inheritance = 干净的数据表 (二) 【献给处女座的DB First程序猿】
  18. linux 系统备份和恢复
  19. SQL Server 基本INSERT语句
  20. Glusterfs挂载报错解决办法

热门文章

  1. 正确设置Linux的ulimit值的方法
  2. Linux驱动 - select函数介绍
  3. HTML 5中的结构元素
  4. Celery-4.1 用户指南: Configuration and defaults (配置和默认值)
  5. eclipse下搭建Drools规则引擎环境
  6. 什么是SPU、SKU、SKC、ARPU
  7. 问题:c# json解析;结果:c# 解析JSON的几种办法
  8. DAY7-面向对象之绑定方法与非绑定方法
  9. HTML-&gt;CSS-&gt;JS-&gt;PHP的顺序及相关网址(转)
  10. SSM项目连接远程Linux服务器的mysql 启动tomcat卡在了 Initializing Spring root WebApplicationContext