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ố cách ghép những bạn nữ có trong mask với các bạn nam có chỉ số từ 0 đến popcount(mask) - 1
  22. // (popcount(mask) = số bit 1 hay số bạn nữ có trong mask)
  23.  
  24. int main() {
  25. ios::sync_with_stdio(false);
  26. cin.tie(nullptr);
  27. cin >> n;
  28. for (int i = 0; i < n; i++) {
  29. for (int j = 0; j < n; j++) cin >> a[i][j];
  30. }
  31.  
  32. for (int mask = 0; mask < (1 << n); mask++) {
  33. if (mask == 0) {
  34. dp[mask] = 1;
  35. continue;
  36. }
  37. dp[mask] = 0;
  38. // Chỉ số của bạn nam hiện tại cần bắt cặp
  39. int i = __builtin_popcount(mask) - 1;
  40. 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
  41. if (!(mask & (1 << j))) continue;
  42. if (!a[i][j]) continue;
  43. int prev_mask = mask ^ (1 << j);
  44. add(dp[mask], dp[prev_mask]);
  45. }
  46. }
  47.  
  48. cout << dp[(1 << n) - 1] << '\n';
  49. }
Success #stdin #stdout 0.01s 5316KB
stdin
3
0 1 1
1 0 1
1 1 1
stdout
3