C - Ilya And The Tree Codeforces Round #430 (Div. 2)
http://codeforces.com/contest/842/problem/C
树 dp
一个数的质因数有限,用set存储,去重
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cmath> 4 #include <cstring> 5 #include <time.h> 6 #include <string> 7 #include <set> 8 #include <map> 9 #include <list> 10 #include <stack> 11 #include <queue> 12 #include <vector> 13 #include <bitset> 14 #include <ext/rope> 15 #include <algorithm> 16 #include <iostream> 17 using namespace std; 18 #define ll long long 19 #define minv 1e-6 20 #define inf 1e9 21 #define pi 3.1415926536 22 #define E 2.7182818284 23 const ll mod=1e9+7;//998244353 24 const int maxn=2e5+10; 25 26 struct node 27 { 28 int d; 29 node* next; 30 }*e[maxn]; 31 32 set<int>y[maxn]; //delete one 33 int a[maxn],x[maxn],value[maxn]; 34 bool vis[maxn]={0}; 35 36 void dfs(int d) 37 { 38 set<int>::iterator i; 39 int dd; 40 41 value[d]=x[d]; 42 for (i=y[d].begin();i!=y[d].end();i++) 43 value[d]=max(value[d],*i); 44 45 node* p=e[d]; 46 vis[d]=1; 47 while (p) 48 { 49 dd=p->d; 50 if (!vis[dd]) 51 { 52 x[dd]=__gcd(x[d],a[dd]); 53 y[dd].insert(x[d]); 54 for (i=y[d].begin();i!=y[d].end();i++) 55 y[dd].insert(__gcd(a[dd],*i)); 56 if (d==1) 57 y[dd].insert(a[dd]); 58 dfs(dd); 59 } 60 p=p->next; 61 } 62 //free memory 63 y[d].clear(); 64 } 65 66 int main() 67 { 68 node* p; 69 int n,X,y,i; 70 scanf("%d",&n); 71 for (i=1;i<=n;i++) 72 scanf("%d",&a[i]); 73 for (i=1;i<n;i++) 74 { 75 scanf("%d%d",&X,&y); 76 p=(node*) malloc (sizeof(node)); 77 p->d=y; 78 p->next=e[X]; 79 e[X]=p; 80 81 p=(node*) malloc (sizeof(node)); 82 p->d=X; 83 p->next=e[y]; 84 e[y]=p; 85 } 86 87 x[1]=a[1]; 88 dfs(1); 89 90 for (i=1;i<n;i++) 91 printf("%d ",value[i]); 92 printf("%d",value[i]); 93 return 0; 94 } 95 /* 96 3 97 6 10 12 98 1 2 99 2 3 100 */