Advertisement
isaf27

Global Round 7, solution of the problem F

Mar 19th, 2020
1,565
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.42 KB | None | 0 0
  1. #include <cmath>
  2. #include <functional>
  3. #include <iostream>
  4. #include <vector>
  5. #include <algorithm>
  6. #include <string>
  7. #include <set>
  8. #include <map>
  9. #include <list>
  10. #include <time.h>
  11. #include <math.h>
  12. #include <random>
  13. #include <deque>
  14. #include <queue>
  15. #include <cassert>
  16. #include <unordered_map>
  17. #include <unordered_set>
  18. #include <iomanip>
  19. #include <bitset>
  20. #include <sstream>
  21. #include <chrono>
  22. #include <cstring>
  23.  
  24. using namespace std;
  25.  
  26. typedef unsigned long long ll;
  27.  
  28. #ifdef iq
  29.   mt19937 rnd(228);
  30. #else
  31.   mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
  32. #endif
  33.  
  34. const int N = 19;
  35.  
  36. int g[N];
  37. ll dp[1 << N][N+1];
  38. ll ok[1 << N];
  39.  
  40. ll slen[N+1][1 << N];
  41.  
  42. ll cur[N+1][1 << N];
  43. ll val[1 << N];
  44.  
  45. ll ans[1 << N];
  46.  
  47. int main() {
  48. #ifdef iq
  49.   freopen("a.in", "r", stdin);
  50. #endif
  51.   ios::sync_with_stdio(0);
  52.   cin.tie(0);
  53.   int n;
  54.   cin >> n;
  55.   for (int i = 0; i < n; i++) {
  56.     for (int j = 0; j < n; j++) {
  57.       char c;
  58.       cin >> c;
  59.       if (c == '1') {
  60.         g[i] |= (1 << j);
  61.       }
  62.     }
  63.   }
  64.   for (int i = 0; i < n; i++) {
  65.     dp[1 << i][i] = 1;
  66.   }
  67.   for (int mask = 0; mask < (1 << n); mask++) {
  68.     for (int i = 0; i < n; i++) {
  69.       int cands = g[i] & (~mask);
  70.       for (int j = 0; j < n; j++) {
  71.         if ((cands >> j) & 1) {
  72.           dp[mask | (1 << j)][j] += dp[mask][i];
  73.         }
  74.       }
  75.       ok[mask] += dp[mask][i];
  76.     }
  77.   }
  78.   for (int len = 1; len <= n; len++) {
  79.     for (int mask = 0; mask < (1 << n); mask++) {
  80.       if (__builtin_popcount(mask) == len) {
  81.         slen[len][mask] += ok[mask];
  82.       }
  83.     }
  84.     for (int i = 0; i < n; i++) {
  85.       for (int mask = 0; mask < (1 << n); mask++) {
  86.         if ((mask >> i) & 1) {
  87.           slen[len][mask] += slen[len][mask ^ (1 << i)];
  88.         }
  89.       }
  90.     }
  91.   }
  92.   map <vector <int>, vector <int> > ok;
  93.   for (int mask = 0; mask < (1 << (n - 1)); mask++) {
  94.     int x = 0;
  95.     vector <int> t;
  96.     while (x < n) {
  97.       int len = 1;
  98.       while ((mask >> x) & 1) {
  99.         x++;
  100.         len++;
  101.       }
  102.       t.push_back(len);
  103.       x++;
  104.     }
  105.     sort(t.begin(), t.end());
  106.     ok[t].push_back(mask);
  107.   }
  108.   vector <int> a;
  109.   for (int mask = 0; mask < (1 << n); mask++)
  110.     val[mask] = 1;
  111.   function<void(int,int)> f = [&] (int s, int last) {
  112.     if (s == n) {
  113.       ll ret = 0;
  114.       int x = (1 << n) - 1;
  115.       for (int mask = 0; mask < (1 << n); mask++) {
  116.         if (__builtin_popcount(mask) % 2 == 0)
  117.           ret += val[x ^ mask];
  118.         else
  119.           ret -= val[x ^ mask];
  120.       }
  121.       for (auto c : ok[a]) {
  122.         ans[c] += ret;
  123.       }
  124.       return;
  125.     }
  126.     if (s + last > n) {
  127.       return;
  128.     }
  129.     for (int mask = 0; mask < (1 << n); mask++) {
  130.       cur[s][mask] = val[mask];
  131.     }
  132.     for (int i = last; s + i <= n; i++) {
  133.       if (s + i != n && s + i + i > n) continue;
  134.       a.push_back(i);
  135.       for (int mask = 0; mask < (1 << n); mask++) {
  136.         val[mask] *= slen[i][mask];
  137.       }
  138.       f(s + i, i);
  139.       for (int mask = 0; mask < (1 << n); mask++) {
  140.         val[mask] = cur[s][mask];
  141.       }
  142.       a.pop_back();
  143.     }
  144.   };
  145.   f(0, 1);
  146.   for (int i = 0; i < (n - 1); i++) {
  147.     for (int mask = 0; mask < (1 << (n - 1)); mask++) {
  148.       if (!((mask >> i) & 1)) {
  149.         ans[mask] -= ans[mask + (1 << i)];
  150.       }
  151.     }
  152.   }
  153.   for (int mask = 0; mask < (1 << (n - 1)); mask++) {
  154.     cout << ans[mask] << ' ';
  155.   }
  156.   cout << endl;
  157. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement