Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #include <ext/pb_ds/assoc_container.hpp>
- #include <ext/pb_ds/tree_policy.hpp>
- using namespace std;
- using namespace __gnu_pbds;
- #define FAST ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
- #define ll long long
- #define ull unsigned long long
- #define pi 2*acos(0.0)
- #define readl(v,n) for(ll i=0;i<n;i++) {ll val; cin>>val; v.pb(val);}
- #define srt(v) sort(v.begin(), v.end());
- #define rsrt(v) sort(v.rbegin(), v.rend());
- #define MIN(v) *min_element(v.begin(), v.end())
- #define MAX(v) *max_element(v.begin(), v.end())
- #define sz(x) ((ll) (x).size())
- #define all(x) (x).begin(), (x).end()
- #define vll vector <ll>
- #define pll pair <ll, ll>
- #define M 1005
- #define MOD 1000000007
- #define pb push_back
- #define mp make_pair
- #define ff first
- #define ss second
- #define endl "\n"
- #define inf 1000000000000000000
- #define ninf -1000000000000000000
- #define memo(x,val) memset(x,val,sizeof(x))
- // PBDS
- template <class T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
- template <class T> using multi_ordered_set = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;
- template <class T> using r_ordered_set = tree<T, null_type, greater<T>, rb_tree_tag, tree_order_statistics_node_update>;
- template <class T> using r_multi_ordered_set = tree<T, null_type, greater_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;
- // ordered_set<ll> s;
- // s.order_of_key(k); --> number of items strictly smaller than k
- // s.find_by_order(k); --> k-th item in set (0-indexing) (returns iterator)
- // debugging
- #define debx(x) cout << #x << " = " << (x) << endl
- #define deb2(a,b) cout<<#a<<" = "<<(a)<<", "<<#b<<" = "<<(b)<<endl
- #define deb3(a,b,c) cout<<#a<<" = "<<(a)<<", "<<#b<<" = "<<(b)<<", "<<#c<<" = "<<(c)<<endl
- #define debv(v) cout<<#v<<" = "; for(auto x: v) {cout<<x<<", ";} cout<<endl;
- #define debv2(v) for(int i=0; i<v.size(); i++) {cout<<#v<<"["<<i<<"] = "<<v[i]<<endl;}
- template<typename... T>
- void debm(T&&... args) {
- ((cout << args << ", "), ...);
- cout << endl;
- }
- /*
- ---- take notes here ----
- */
- vector <ll> primes;
- bool marked[M+5];
- map<ll,ll> indx;
- //bitset<M+5> marked;
- void sieve()
- {
- marked[0]=marked[1]=1;
- for(ll i = 2; i*i <= M; i++)
- {
- if(!marked[i])
- {
- for(ll j = i*i; j <= M; j += i)
- {
- marked[j]=1;
- }
- }
- }
- primes.push_back(2);
- for(ll i = 3; i <= M; i+=2)
- {
- if(!marked[i])
- {
- primes.push_back(i);
- }
- }
- for(ll i=0; i<sz(primes); i++)
- {
- indx[primes[i]] = i;
- }
- }
- const ll N = 30005;
- const ll NN = 200;
- vll graph[N];
- ll ara[N];
- ll fr[N][NN];
- void calc(ll n, ll id)
- {
- for(ll i=0; primes[i]*primes[i]<=n && i<sz(primes); i++)
- {
- if(n%primes[i]==0)
- {
- while(n%primes[i]==0)
- {
- n/=primes[i];
- fr[id][i]++;
- }
- }
- }
- if(n>1)
- {
- ll pid = indx[n];
- fr[id][pid]++;
- }
- }
- void merge(ll u, ll v)
- {
- for(ll i=0; i<sz(primes); i++)
- {
- fr[u][i] += fr[v][i];
- }
- }
- void dfs(ll u, ll p)
- {
- calc(ara[u], u);
- for(auto v: graph[u])
- {
- if(v!=p)
- {
- dfs(v,u);
- merge(u,v);
- }
- }
- }
- void solve()
- {
- ll n; cin>>n;
- for(ll i=1; i<=n; i++)
- {
- graph[i].clear();
- for(ll j=0; j<168; j++)
- {
- fr[i][j] = 0;
- }
- cin>>ara[i];
- }
- for(ll i=1; i<=n-1; i++)
- {
- ll u,v; cin>>u>>v;
- graph[u].pb(v);
- graph[v].pb(u);
- }
- dfs(1,-1);
- for(ll i=1; i<=n; i++)
- {
- ll nod=1;
- for(ll j=0; j<168; j++)
- {
- nod *= (fr[i][j] + 1);
- }
- cout<<nod<<" ";
- }
- cout<<endl;
- }
- int main()
- {
- FAST
- sieve();
- int t = 1;
- cin >> t;
- while(t--)
- {
- #ifndef ONLINE_JUDGE
- cout<<endl;
- #endif
- solve();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment