Ankit_132

Build Towers

Jul 12th, 2023
362
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.32 KB | None | 0 0
  1.  
  2. #include <bits/stdc++.h>
  3.  
  4. using namespace std;
  5.  
  6. #define ll     long long
  7. #define _test   int _TEST; cin>>_TEST; while(_TEST--)
  8.  
  9. #define MOD 1000000007
  10.  
  11. const int N = 3000005;
  12. ll int fact[N], invfact[N];
  13.  
  14. ll int pow(ll int a, ll int b, ll int m)
  15. {
  16.     ll int ans=1;
  17.     while(b)
  18.     {
  19.         if(b&1)
  20.             ans=(ans*a)%m;
  21.         b/=2;
  22.         a=(a*a)%m;
  23.     }
  24.     return ans;
  25. }
  26.  
  27. ll int modinv(ll int k)
  28. {
  29.     return pow(k, MOD-2, MOD);
  30. }
  31.  
  32. void precompute()
  33. {
  34.     fact[0]=fact[1]=1;
  35.     for(int i=2;i<N;i++)
  36.     {
  37.         fact[i]=fact[i-1]*i;
  38.         fact[i]%=MOD;
  39.     }
  40.  
  41.     invfact[N-1]=modinv(fact[N-1]);
  42.     for(int i=N-2;i>=0;i--)
  43.     {
  44.         invfact[i]=invfact[i+1]*(i+1);
  45.         invfact[i]%=MOD;
  46.     }
  47. }
  48.  
  49. ll int nCr(ll int x, ll int y)
  50. {
  51.     if(y>x)
  52.         return 0;
  53.     ll int num=fact[x];
  54.     num*=invfact[y];
  55.     num%=MOD;
  56.     num*=invfact[x-y];
  57.     num%=MOD;
  58.     return num;
  59. }
  60.  
  61. int main()
  62. {
  63.     precompute();
  64.  
  65.     _test
  66.     {
  67.         int n;
  68.         cin>>n;
  69.  
  70.         vector<ll int> a(n);
  71.         for(auto &e: a)     cin>>e;
  72.  
  73.         vector<vector<int>> tree(n);
  74.  
  75.         for(int i=0; i<n-1; i++)
  76.         {
  77.             int u, v;
  78.             cin>>u>>v;
  79.  
  80.             u--, v--;
  81.  
  82.             tree[u].push_back(v);
  83.             tree[v].push_back(u);
  84.         }
  85.  
  86.         vector<int> needTower(n, 0);
  87.  
  88.         function<void(int, int)> DFS = [&](int u, int p)
  89.         {
  90.             for(auto v: tree[u])
  91.             {
  92.                 if(v == p)      continue;
  93.  
  94.                 DFS(v, u);
  95.  
  96.                 needTower[u] = max(needTower[u], needTower[v]);
  97.             }
  98.  
  99.             if(a[u] > 0)        needTower[u] = 1;
  100.         };
  101.  
  102.         DFS(0, -1);
  103.  
  104.         vector<ll int> vals(n, 1);
  105.         vector<ll int> tot(n, 0);
  106.  
  107.         function<void(int, int)> DFS2 = [&](int u, int p)
  108.         {
  109.             tot[u] = a[u];
  110.  
  111.             for(auto v: tree[u])
  112.             {
  113.                 if(v == p)          continue;
  114.                 if(!needTower[v])   continue;
  115.  
  116.                 DFS2(v, u);
  117.  
  118.                 (vals[u] *= nCr(tot[u]+tot[v], tot[u])) %= MOD;
  119.                 (vals[u] *= vals[v]) %= MOD;
  120.                 tot[u] += tot[v];
  121.             }
  122.  
  123.             tot[u]++;
  124.         };
  125.  
  126.         DFS2(0, -1);
  127.  
  128.         cout<<vals[0]<<"\n";
  129.     }
  130. }
  131.  
Advertisement
Add Comment
Please, Sign In to add comment