Advertisement
_rashed

SPOJ ASSIGN

Jul 4th, 2022
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.18 KB | None | 0 0
  1. #define ll long long
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. const int OO = 1e9;
  6. const double EPS = 1e-9;
  7.  
  8. ll mem[(1 << 20)];
  9. int n;
  10.  
  11. vector<vector<int>> k;
  12.  
  13. ll solve(bitset<20> msk) {
  14.     int idx = msk.count();
  15.     if(idx == n) {
  16.         return 1;
  17.     }
  18.     if(mem[msk.to_ullong()] != -1) {
  19.         return mem[msk.to_ullong()];
  20.     }
  21.     ll &ret = mem[msk.to_ullong()];
  22.     ret = 0;
  23.     for(int e : k[idx]) {
  24.         if(!msk[e]) {
  25.             bitset<20> cp = msk;
  26.             cp[e] = 1;
  27.             ret += solve(cp);
  28.         }
  29.     }
  30.     return ret;
  31. }
  32.  
  33. int main()
  34. {
  35.     ios_base::sync_with_stdio(false);
  36.     cin.tie(NULL);
  37.     cout.tie(NULL);
  38.     int t;
  39.     cin >> t;
  40.     while(t--) {
  41.         cin >> n;
  42.         k.clear();
  43.         k.resize(n);
  44.         for(int i = 0; i < n; i++) {
  45.             for(int j = 0; j < n; j++) {
  46.                 bool b;
  47.                 cin >> b;
  48.                 if(b) {
  49.                     k[i].push_back(j);
  50.                 }
  51.             }
  52.         }
  53.         for(int i = (1 << n)-1; i >= 0; i--) {
  54.             mem[i] = -1;
  55.         }
  56.         bitset<20> msk;
  57.         cout << solve(msk) << "\n";
  58.     }
  59.     return 0;
  60. }
  61.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement