按照题解的做法,对于每一个质约数分别进行讨论最长链就行
对于每一个数的质约数可是比logn还要小的

比赛的时候没人写,我也没看 = =,可惜了,不过我当时对于复杂度的把握也不大啊

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <map>
#include <set>
#include <queue>
#include <cmath>
using namespace std;
typedef long long ll;
#define MP(x, y) make_pair(x, y)
#define lson l,m, rt<<1
#define rson m+1, r, rt<<1|1
const int N = 1e5+5;
const int INF = 0x3f3f3f3f; struct Node{
int to, nx;
}E[N*2];
int head[N], tot;
void add(int fr, int to) {
E[tot].to = to; E[tot].nx = head[fr]; head[fr] = tot ++;
}
int vis[N]; int nw; int divisor; int val[N];
int Prime[N];
int Isprime[N]; int cnt;
int dis[N];
int ans; map<int, vector<int> > mp;
map<int, vector<int> > ::iterator it; void dfs(int x) {
dis[x] = 1;
int maxx = 0, Maxx = 0;
for(int i = head[x]; ~i; i = E[i].nx) {
int y = E[i].to;
if(vis[y] == nw || val[y] % divisor) continue;
vis[y] = nw;
dfs(y);
if(dis[y] > Maxx) maxx = Maxx, Maxx = dis[y];
else if(dis[y] > maxx) maxx = dis[y];
}
ans = max(maxx + Maxx + 1, ans);
dis[x] = Maxx + 1;
}
void solve(int x) {
divisor = x; // printf("%d: ",x); for(int i = 0; i < mp[x].size(); ++i) printf("%d ", mp[x][i]); printf("\n");
++nw;
for(int i = 0; i < mp[x].size(); ++i) {
int y = mp[x][i];
if(vis[y] != nw) {
vis[y] = nw;
dfs(y);
// printf("hh\n");
}
}
}
int main() {
int n;
cnt = 0;
for(int i = 2; i < N; ++i) {
if(!Prime[i]) {
Isprime[++cnt] = i;
for(int j = 2*i; j < N; j += i) {
Prime[j] ++;
}
}
}
// for(int i = 1; i <= 10; ++i) printf("%d ", Isprime[i]); printf("\n");
while(~scanf("%d", &n)) {
mp.clear();
nw = 0; memset(vis, 0, sizeof(vis));
memset(head, -1, sizeof(head)); tot = 0; for(int i = 1; i < n; ++i) {
int a, b; scanf("%d %d", &a, &b);
add(a, b); add(b, a);
}
for(int i = 1; i <= n; ++i) {
scanf("%d", &val[i]);
int tt = val[i];
// printf("%d ", val[i]);
for(int j = 1; 1ll*Isprime[j] * Isprime[j] <= tt; ++j) {
if(tt % Isprime[j] == 0) {
mp[Isprime[j]].push_back(i);
while(tt % Isprime[j] == 0) {
tt /= Isprime[j];
}
}
}
if(tt != 1) {
mp[tt].push_back(i);
}
}
// printf("hh\n"); ans = -1;
for(it = mp.begin(); it != mp.end(); ++it) {
solve(it->first);
} printf("%d\n", ans);
}
return 0;
}

最新文章

  1. SQL Server2005清除数据库日志
  2. 自己封装的Windows7 64位旗舰版,微软官网上下载的Windows7原版镜像制作,绝对纯净版
  3. 5、python第一天作业
  4. Xcode 8 : iOS xib is missing from working copy、iOS misssing file
  5. Unity3D打Box游戏
  6. [MyBean-插件]MyBean通用报表免费无限制版本发布
  7. Python 学习之进制与编码
  8. C/C++指针内存分配小细节
  9. JAVA之关于This的用法
  10. &lt;二&gt; SQL 基础
  11. mongodb的应用场景
  12. SqlServer死锁与阻塞检测脚本
  13. Python大婶博客汇总
  14. python日期格式化操作
  15. InetAddress and InetSocketAddress
  16. MySQL创建远程用户并授权
  17. 如何查看.Net Framework版本
  18. WEB前端面试2014阿里旺旺
  19. React props传变量
  20. 【洛谷P1892】团伙

热门文章

  1. Java设计模式——策略模式
  2. 夏令营讲课内容整理 Day 6 Part 1.
  3. BZOJ 2073: [POI2004]PRZ [DP 状压]
  4. 面向对象编程总结--Python
  5. python爬虫(4)——正则表达式(一)
  6. 自己写的一个vii总结
  7. hiveql笔记(一)
  8. CentOS6.8配置GO语言开发环境
  9. (转)CocoaPods:管理Objective-c 程序中各种第三方开源库关联
  10. 织梦去除版权中的Power by DedeCms