Friday, September 27, 2019

[Codemarshal] A. Tree Mania

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : A. Tree Mania
Source            : Codemarshal
                    SUB IUPC 2015
Category          : Combinatorics
Algorithm         : Prufer Code
Verdict           : Accepted

  1. #include "bits/stdc++.h"  
  2.   
  3. using namespace std;  
  4.   
  5. static const int maxn = 2e5 + 5;  
  6. static const long long mod = 1e9 + 7;  
  7.   
  8. long long binaryExpo(long long a, long long p, long long m)  
  9. {  
  10.       if (p <= 0) return 1 % m;  
  11.       if (p == 1) return a % m;  
  12.       if (p & 1) return (a % m * binaryExpo(a, p - 1, m)) % m;  
  13.       long long ret = binaryExpo(a, p / 2, m);  
  14.       return (ret % m * ret % m) % m;  
  15. }  
  16.   
  17. long long modInv(long long a, long long m)  
  18. {  
  19.       return binaryExpo(a, m - 2, m);  
  20. }  
  21.   
  22. long long fact[maxn];  
  23. long long ifact[maxn];  
  24. long long deg[maxn];  
  25.   
  26. void preCalc()  
  27. {  
  28.       fact[0] = 1LL;  
  29.       ifact[0] = 1LL;  
  30.       for (int i = 1; i < maxn; i++)  
  31.       {  
  32.             fact[i] = (1LL * i * fact[i - 1]) % mod;  
  33.             ifact[i] = modInv(fact[i], mod);  
  34.       }  
  35. }  
  36.   
  37. long long nCr(int n, int r)  
  38. {  
  39.       if (n < r) return 0;  
  40.       long long x = fact[n];  
  41.       long long y = (ifact[r] * ifact[n - r]) % mod;  
  42.       long long ncr = (x * y) % mod;  
  43.       return ncr;  
  44. }  
  45.   
  46. signed main()  
  47. {  
  48.       ios_base::sync_with_stdio(false);  
  49.       cin.tie(nullptr);  
  50.       cout.tie(nullptr);  
  51.   
  52.       #ifndef ONLINE_JUDGE  
  53.             freopen("in.txt""r", stdin);  
  54.       #endif // ONLINE_JUDGE  
  55.   
  56.       preCalc();  
  57.   
  58.       int tc;  
  59.       cin >> tc;  
  60.       for (int tcase = 1; tcase <= tc; tcase++)  
  61.       {  
  62.             int n;  
  63.             cin >> n;  
  64.             int sum = 0;  
  65.             for (int i = 1; i <= n - 2; i++)  
  66.             {  
  67.                   cin >> deg[i];  
  68.                   sum += deg[i];  
  69.             }  
  70.             long long ans = 1;  
  71.             int N = n - 2;  
  72.             for (int i = 1; i <= n - 2; i++)  
  73.             {  
  74.                   long long x = nCr(N, deg[i] - 1);  
  75.                   ans = (ans * x) % mod;  
  76.                   N -= (deg[i] - 1);  
  77.             }  
  78.             int loop = 2 * (n - 1) - sum;  
  79.             long long binomial = binaryExpo(2, loop - 2, mod);  
  80.             long long totalTree = (ans * binomial) % mod;  
  81.             cout << "Case " << tcase << ": " << totalTree << '\n';  
  82.       }  
  83. }  

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.