fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7.  
  8. const int INF = 1e9;
  9. const ll LINF = 1e18;
  10.  
  11. const int MOD = 1e9 + 7;
  12.  
  13. void add(int& a, int b) {
  14. a += b;
  15. if (a >= MOD) a -= MOD;
  16. }
  17.  
  18. int n;
  19. int a[21][21];
  20.  
  21. int dp[1 << 21]; // dp[mask] = Số hoán vị của tập hợp những bạn nữ có trong tập mask
  22. // sao cho bắt cặp được với các bạn nam có chỉ số từ 0 đến |mask| - 1
  23. // |mask| = số bit 1 hay số bạn nữ có trong tập mask
  24.  
  25. int main() {
  26. ios::sync_with_stdio(false);
  27. cin.tie(nullptr);
  28. cin >> n;
  29. for (int i = 0; i < n; i++) {
  30. for (int j = 0; j < n; j++) cin >> a[i][j];
  31. }
  32.  
  33. dp[0] = 1;
  34. for (int mask = 0; mask < (1 << n); mask++) {
  35. // chỉ số của bạn nam hiện tại cần bắt cặp
  36. int i = __builtin_popcount(mask);
  37. for (int j = 0; j < n; j++) { // chỉ số của bạn nữ sẽ bắt cặp với bạn nam i
  38. if ((mask >> j) & 1) continue;
  39. if (!a[i][j]) continue;
  40. int next_mask = mask | (1 << j);
  41. add(dp[next_mask], dp[mask]);
  42. }
  43. }
  44.  
  45. cout << dp[(1 << n) - 1] << '\n';
  46. }
Success #stdin #stdout 0.01s 5276KB
stdin
3
0 1 1
1 0 1
1 1 1
stdout
3