Guest User

TREEDIVS

a guest
Sep 22nd, 2022
286
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.96 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. #include <ext/pb_ds/tree_policy.hpp>
  4.  
  5. using namespace std;
  6. using namespace __gnu_pbds;
  7.  
  8. #define FAST ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
  9. #define ll long long
  10. #define ull unsigned long long
  11. #define pi 2*acos(0.0)
  12. #define readl(v,n) for(ll i=0;i<n;i++) {ll val; cin>>val; v.pb(val);}
  13. #define srt(v) sort(v.begin(), v.end());
  14. #define rsrt(v) sort(v.rbegin(), v.rend());
  15. #define MIN(v) *min_element(v.begin(), v.end())
  16. #define MAX(v) *max_element(v.begin(), v.end())
  17. #define sz(x) ((ll) (x).size())
  18. #define all(x) (x).begin(), (x).end()
  19. #define vll vector <ll>
  20. #define pll pair <ll, ll>
  21. #define M 1005
  22. #define MOD 1000000007
  23. #define pb push_back
  24. #define mp make_pair
  25. #define ff first
  26. #define ss second
  27. #define endl "\n"
  28. #define inf 1000000000000000000
  29. #define ninf -1000000000000000000
  30. #define memo(x,val) memset(x,val,sizeof(x))
  31.  
  32. // PBDS
  33.  
  34. template <class T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
  35. template <class T> using multi_ordered_set = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;
  36. template <class T> using r_ordered_set = tree<T, null_type, greater<T>, rb_tree_tag, tree_order_statistics_node_update>;
  37. template <class T> using r_multi_ordered_set = tree<T, null_type, greater_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;
  38. // ordered_set<ll> s;
  39. // s.order_of_key(k); --> number of items strictly smaller than k
  40. // s.find_by_order(k); --> k-th item in set (0-indexing) (returns iterator)
  41.  
  42. // debugging
  43.  
  44. #define debx(x) cout << #x << " = " << (x) << endl
  45. #define deb2(a,b) cout<<#a<<" = "<<(a)<<", "<<#b<<" = "<<(b)<<endl
  46. #define deb3(a,b,c) cout<<#a<<" = "<<(a)<<", "<<#b<<" = "<<(b)<<", "<<#c<<" = "<<(c)<<endl
  47. #define debv(v) cout<<#v<<" = "; for(auto x: v) {cout<<x<<", ";} cout<<endl;
  48. #define debv2(v) for(int i=0; i<v.size(); i++) {cout<<#v<<"["<<i<<"] = "<<v[i]<<endl;}
  49.  
  50. template<typename... T>
  51. void debm(T&&... args) {
  52.     ((cout << args << ", "), ...);
  53.     cout << endl;
  54. }
  55.  
  56. /*
  57.     ---- take notes here ----
  58.    
  59. */
  60.  
  61. vector <ll> primes;
  62. bool marked[M+5];
  63. map<ll,ll> indx;
  64. //bitset<M+5> marked;
  65.  
  66. void sieve()
  67. {
  68.     marked[0]=marked[1]=1;
  69.     for(ll i = 2; i*i <= M; i++)
  70.     {
  71.         if(!marked[i])
  72.         {
  73.             for(ll j = i*i; j <= M; j += i)
  74.             {
  75.                 marked[j]=1;
  76.             }
  77.         }
  78.     }
  79.  
  80.     primes.push_back(2);
  81.     for(ll i = 3; i <= M; i+=2)
  82.     {
  83.         if(!marked[i])
  84.         {
  85.             primes.push_back(i);
  86.         }
  87.     }
  88.    
  89.     for(ll i=0; i<sz(primes); i++)
  90.     {
  91.         indx[primes[i]] = i;
  92.     }
  93. }
  94.  
  95. const ll N = 30005;
  96. const ll NN = 200;
  97.  
  98. vll graph[N];
  99. ll ara[N];
  100.  
  101.  
  102. ll fr[N][NN];
  103.  
  104. void calc(ll n, ll id)
  105. {
  106.     for(ll i=0; primes[i]*primes[i]<=n && i<sz(primes); i++)
  107.     {
  108.         if(n%primes[i]==0)
  109.         {
  110.             while(n%primes[i]==0)
  111.             {
  112.                 n/=primes[i];
  113.                 fr[id][i]++;
  114.             }
  115.         }
  116.     }
  117.    
  118.     if(n>1)
  119.     {
  120.         ll pid = indx[n];
  121.        
  122.         fr[id][pid]++;
  123.     }
  124. }
  125.  
  126. void merge(ll u, ll v)
  127. {
  128.     for(ll i=0; i<sz(primes); i++)
  129.     {
  130.         fr[u][i] += fr[v][i];
  131.     }
  132. }
  133.  
  134. void dfs(ll u, ll p)
  135. {
  136.     calc(ara[u], u);
  137.    
  138.     for(auto v: graph[u])
  139.     {
  140.         if(v!=p)
  141.         {
  142.             dfs(v,u);
  143.            
  144.             merge(u,v);
  145.         }
  146.     }
  147. }
  148.  
  149. void solve()
  150. {
  151.     ll n; cin>>n;
  152.    
  153.     for(ll i=1; i<=n; i++)
  154.     {
  155.         graph[i].clear();
  156.        
  157.         for(ll j=0; j<168; j++)
  158.         {
  159.             fr[i][j] = 0;
  160.         }
  161.        
  162.         cin>>ara[i];
  163.     }
  164.    
  165.     for(ll i=1; i<=n-1; i++)
  166.     {
  167.         ll u,v; cin>>u>>v;
  168.        
  169.         graph[u].pb(v);
  170.         graph[v].pb(u);
  171.     }
  172.    
  173.     dfs(1,-1);
  174.    
  175.     for(ll i=1; i<=n; i++)
  176.     {
  177.         ll nod=1;
  178.        
  179.         for(ll j=0; j<168; j++)
  180.         {
  181.             nod *= (fr[i][j] + 1);
  182.         }
  183.        
  184.         cout<<nod<<" ";
  185.     }
  186.     cout<<endl;
  187. }
  188.  
  189. int main()
  190. {
  191.     FAST
  192.    
  193.     sieve();
  194.    
  195.     int t = 1;
  196.     cin >> t;
  197.     while(t--)
  198.     {
  199.         #ifndef ONLINE_JUDGE
  200.         cout<<endl;
  201.         #endif
  202.    
  203.         solve();    
  204.     }
  205.  
  206.     return 0;
  207. }
Advertisement
Add Comment
Please, Sign In to add comment