Monday, September 30, 2019

[Codeforces] D - Table with Letters - 2

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : D - Table with Letters - 2
Source            : Codeforces
Category          : Data Structure, Two Pointer
Algorithm         : Two Pointer
Verdict           : Accepted

  1. #include "bits/stdc++.h"  
  2.   
  3. using namespace std;  
  4.   
  5. static const int maxn = 400 + 5;  
  6.   
  7. int row;  
  8. int column;  
  9. int maxa;  
  10. char grid[maxn][maxn];  
  11. int mat[maxn][maxn];  
  12.   
  13. int subRectangleSum(int x1, int y1, int x2, int y2)  
  14. {  
  15.       int sum = mat[x2][y2] - mat[x2][y1 - 1] - mat[x1 - 1][y2] + mat[x1 - 1][y1 - 1];  
  16.       return sum;  
  17. }  
  18.   
  19. void solve()  
  20. {  
  21.       long long ans = 0;  
  22.       for (int col_1 = 1; col_1 <= column; col_1++)  
  23.       {  
  24.             for (int col_2 = col_1 + 1; col_2 <= column; col_2++)  
  25.             {  
  26.                   int preRow = 1;  
  27.                   vector <int> same(27, 0);  
  28.                   for (int nxtRow = 1; nxtRow <= row; nxtRow++)  
  29.                   {  
  30.                         if (grid[nxtRow][col_1] == grid[nxtRow][col_2])  
  31.                         {  
  32.                               int val = grid[nxtRow][col_1] - 'a' + 1;  
  33.                               while (preRow < nxtRow)  
  34.                               {  
  35.                                     int total_a = subRectangleSum(preRow, col_1, nxtRow, col_2);  
  36.                                     if (total_a <= maxa) break;  
  37.                                     if (grid[preRow][col_1] == grid[preRow][col_2])  
  38.                                     {  
  39.                                           int bad = grid[preRow][col_1] - 'a' + 1;  
  40.                                           same[bad]--;  
  41.                                     }  
  42.                                     preRow++;  
  43.                               }  
  44.                               if (preRow < nxtRow) ans += same[val];  
  45.                               same[val]++;  
  46.                         }  
  47.                   }  
  48.             }  
  49.       }  
  50.       cout << ans << '\n';  
  51. }  
  52.   
  53. signed main()  
  54. {  
  55.       ios_base::sync_with_stdio(false);  
  56.       cin.tie(nullptr);  
  57.       cout.tie(nullptr);  
  58.   
  59.       freopen("input.txt""r", stdin);  
  60.       freopen("output.txt""w", stdout);  
  61.   
  62.       cin >> row >> column >> maxa;  
  63.       for (int i = 1; i <= row; i++)  
  64.       {  
  65.             for (int j = 1; j <= column; j++)  
  66.             {  
  67.                   cin >> grid[i][j];  
  68.                   mat[i][j] = mat[i][j - 1] + (grid[i][j] == 'a');  
  69.             }  
  70.             for (int j = 1; j <= column; j++)  
  71.             {  
  72.                   mat[i][j] += mat[i - 1][j];  
  73.             }  
  74.       }  
  75.       solve();  
  76. }  

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. }