Advertisement
willy108

tree

Nov 25th, 2022
809
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.62 KB | None | 0 0
  1.  
  2. //misaka and elaina will carry me to red
  3.  
  4. #pragma GCC optimize("O3,unroll-loops")
  5. #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
  6.  
  7. #include <iostream>
  8. #include <cmath>
  9. #include <utility>
  10. #include <cassert>
  11. #include <algorithm>
  12. #include <vector>
  13. #include <array>
  14. #include <cstdio>
  15. #include <cstring>
  16. #include <functional>
  17. #include <numeric>
  18. #include <set>
  19. #include <queue>
  20. #include <map>
  21. #include <chrono>
  22. #include <random>
  23.  
  24. #define sz(x) ((int)(x.size()))
  25. #define all(x) x.begin(), x.end()
  26. #define pb push_back
  27. #define eb emplace_back
  28. #define kill(x, s) {if(x){ cout << s << "\n"; return ; }}
  29.  
  30. #ifndef LOCAL
  31. #define cerr while(0) cerr
  32. #endif
  33.  
  34. using ll = long long;
  35. using lb = long double;
  36.  
  37. const lb eps = 1e-9;
  38. const ll mod = 1e9 + 7, ll_max = 1e18;
  39. //const ll mod = (1 << (23)) * 119 +1, ll_max = 1e18;
  40. const int MX = 500 +10, int_max = 0x3f3f3f3f;
  41.  
  42. struct {
  43.   template<class T>
  44.   operator T() {
  45.     T x; std::cin >> x; return x;
  46.   }
  47. } in;
  48.  
  49. using namespace std;
  50.  
  51. ll dp[2][MX][MX*2][4];
  52. ll fac[MX*2], ifac[MX*2];
  53. int deg[MX];
  54.  
  55. ll binpow(ll a, ll b = mod - 2){
  56.     ll ans = 1;
  57.     for(int i = 1; i<=b; i*=2ll){
  58.         if(i&b) (ans *= a) %= mod;
  59.         (a *= a) %= mod;
  60.     }
  61.     return ans;
  62. }
  63.  
  64. void solve(){
  65.     int n = in;
  66.     int leaf = 0;
  67.     kill(n == 1, 0);
  68.     kill(n == 2, 1);
  69.     fac[0] = 1;
  70.     ifac[0] = 1;
  71.     for(int i = 0; i<n; i++){
  72.         deg[i] = in;
  73.         if(deg[i] == 1) leaf++;
  74.     }
  75.     for(int i = 1; i<=n*2; i++){
  76.         fac[i] = 1ll*i*fac[i-1]%mod;
  77.         ifac[i] = binpow(fac[i]);
  78.     }
  79.     dp[0][0][0][0] = 1;
  80.     int sum = 0;
  81.     int r = 0;
  82.     for(int i = 0; i<n; i++){
  83.         for(int j = 0; j<=i; j++){
  84.             for(int k = 0; k<=sum; k++){
  85.                 for(int h = 0; h<2; h++){
  86.                     for(int l = 0; l<4; l+=2){
  87.                         //add to left side
  88.                         ll v = dp[r][j][k][h + l];
  89.                         (dp[r^1][j+1][k + deg[i]][h + l] += ifac[deg[i]-1] * v%mod) %= mod;
  90.                         //add to right side
  91.                         (dp[r^1][j][k][h + l] += ifac[deg[i]-1] * v%mod) %= mod;
  92.                         if(deg[i] > 1){
  93.                             if (h == 0){
  94.                                 // add as left tree endpoint
  95.                                 (dp[r^1][j + 1][k + deg[i] - 1][1 + l] += ifac[deg[i] - 2] * v % mod) %= mod;
  96.                             }
  97.                             if(l == 0){
  98.                                 //add as right tree endpoint
  99.                                 (dp[r^1][j][k][h + 2] += ifac[deg[i] - 2] * v % mod) %= mod;
  100.                             }
  101.                         }
  102.                     }
  103.                 }
  104.             }
  105.         }
  106.         r ^= 1;
  107.         for(int j = 0; j<=n; j++){
  108.             for(int k = 0; k<=2*n-2; k++){
  109.                 for(int hl = 0; hl<4; hl++){
  110.                     dp[r^1][j][k][hl] = 0;
  111.                 }
  112.             }
  113.         }
  114.         sum += deg[i];
  115.     }
  116.     ll ans = 0;
  117.     for(int j = 2; j<=n-2; j++){
  118.         int t = min(j, n - j);
  119.         ans += 1ll * t * fac[n - j - 2] % mod * fac[j - 2] % mod * dp[r][j][2 * j - 2][3] % mod;
  120.     }
  121.     ans %= mod;
  122.     ll tot = fac[n-2];
  123.     for(int i = 1; i<=n; i++){
  124.         tot *= ifac[deg[i-1]-1];
  125.         tot %= mod;
  126.     }
  127.     ans += 2ll*tot*leaf%mod;
  128.     ans %= mod;
  129.     cerr << ans << " " << tot << "\n";
  130.     cout << ans*binpow(2ll*tot%mod)%mod << "\n";
  131. }
  132.  
  133. signed main(){
  134.   cin.tie(0) -> sync_with_stdio(0);
  135.  
  136.   int T = 1;
  137.   //cin >> T;
  138.   for(int i = 1; i<=T; i++){
  139.         //cout << "Case #" << i << ": ";
  140.         solve();
  141.     }
  142.   return 0;
  143. }
  144.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement