Mehulcoder

O-Matching

Nov 3rd, 2020 (edited)
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.59 KB | None | 0 0
  1. /*
  2. Author: Mehul Chaturvedi
  3. Talent is overrated
  4. */
  5.  
  6. #include <bits/stdc++.h>
  7. using namespace std;
  8.  
  9. using ll = long long;
  10. using ld = long double;
  11. using pll = pair<ll, ll>;
  12.  
  13. #define mp make_pair
  14. #define all(x) (x).begin(), (x).end()
  15. #define f first
  16. #define s second
  17. #define vll vector<long long>
  18. #define vvll vector<vector<ll>>
  19. #define vset(v, n, val) v.clear(); v.resize(n, val)
  20. #define INF 4557430888798830399ll
  21. #define fr(i, a, b) for (int i = (a), _b = (b); i <= _b; i++)
  22. #define rep(i, n) for (int i = 0, _n = (n); i < _n; i++)
  23. #define repr(i, n) for (int i = n; i >= 0; i--)
  24. #define frr(i, a, b) for (int i = (a), _b = (b); i >= _b; i--)
  25. #define trav(a, x) for(auto& a : x)
  26. #define fil(ar, val) memset(ar, val, sizeof(ar))
  27. const ll MOD = 1e9 + 7;
  28.  
  29. const ll N = 33;
  30.  
  31. ll n;
  32. bool mat[N][N];
  33.  
  34. ll get(ll end, ll mask) {
  35.     ll girls = __builtin_popcountll(mask);
  36.     if (!girls) return 0;
  37.     if (end == 0) {
  38.         return girls;
  39.     }
  40.  
  41.     ll preMask = 0;
  42.     rep(j, n) {
  43.         if (mat[end - 1][j] == 1) {
  44.             preMask |= (1 << j);
  45.         }
  46.     }
  47.  
  48.     ll ans = 0ll;
  49.     rep(i, n) {
  50.         if ((mask & (1 << i)) != 0) {
  51.             ll temp = get(end - 1, (preMask & ~(1 << (i))));
  52.             ans += temp;
  53.         }
  54.     }
  55.  
  56.     return ans % MOD;
  57.  
  58. }
  59. void solve() {
  60.     cin >> n;
  61.     rep(i, n) {
  62.         rep(j, n) {
  63.             cin >> mat[i][j];
  64.         }
  65.     }
  66.  
  67.     ll mask = 0;
  68.     rep(j, n) {
  69.         if (mat[n - 1][j] == 1) {
  70.             mask |= (1 << j);
  71.         }
  72.     }
  73.     cout << (get(n - 1, mask) % MOD + MOD) % MOD << '\n';
  74. }
  75.  
  76.  
  77.  
  78. int main(int argc , char ** argv) {
  79.     ios_base::sync_with_stdio(false) ;
  80.     cin.tie(NULL) ;
  81.  
  82.     ll t = 1;
  83.     while (t--) {
  84.         solve();
  85.     }
  86.  
  87.     return 0 ;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment