Problem p03174 (C++)

Buggy submission (status: Runtime Error):

/** Which of the favors of your Lord will you deny ? **/

#include <bits/stdc++.h>
using namespace std;

#define LL long long
#define PII pair<int, int>
#define PLL pair<LL, LL>
#define MP make_pair
#define F first
#define S second

#define ALL(x) (x).begin(), (x).end()
#define DBG(x) cerr << __LINE__ << " says: " << #x << " = " << (x) << endl
#define READ freopen("alu.txt", "r", stdin)
#define WRITE freopen("vorta.txt", "w", stdout)

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;

template <class TIn>
using indexed_set = tree<TIn, null_type, less<TIn>, rb_tree_tag,
                         tree_order_statistics_node_update>;

/**

PBDS
-------------------------------------------------
1) insert(value)
2) erase(value)
3) order_of_key(value) // 0 based indexing
4) *find_by_order(position) // 0 based indexing

**/

template <class T1, class T2> ostream &operator<<(ostream &os, pair<T1, T2> &p);
template <class T> ostream &operator<<(ostream &os, vector<T> &v);
template <class T> ostream &operator<<(ostream &os, set<T> &v);

inline void optimizeIO() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
}

const int nmax = 2e5 + 7;
const LL LINF = 1e17;

template <class T> string to_str(T x) {
  stringstream ss;
  ss << x;
  return ss.str();
}

// bool cmp(const PII &A,const PII &B)
//{
//
// }

int match[25][25];

const LL mod = 1e9 + 7;

LL add_self(LL &a, LL b) {
  a += b;
  if (a >= mod)
    a -= mod;
}

int main() {
  optimizeIO();

  int n;
  cin >> n;

  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      cin >> match[i][j];

  vector<LL> dp(1 << n);

  dp[0] = 1;

  for (int mask = 0; mask < (1 << n) - 1; mask++) {
    int m = __builtin_popcount(mask); /// number of already matched men = number
                                      /// of already matched women

    for (int w = 0; w < n; w++) {
      if (match[m][w] &&
          !(mask & (1 << w))) /// this woman is not matched yet and can be
                              /// matched with m+1 th man
        add_self(dp[mask | (1 << w)], dp[mask]);
    }
  }

  cout << dp[(1 << n) - 1] << endl;

  return 0;
}

/**

**/

template <class T1, class T2>
ostream &operator<<(ostream &os, pair<T1, T2> &p) {
  os << "{" << p.first << ", " << p.second << "} ";
  return os;
}
template <class T> ostream &operator<<(ostream &os, vector<T> &v) {
  os << "[ ";
  for (int i = 0; i < v.size(); i++) {
    os << v[i] << " ";
  }
  os << " ]";
  return os;
}

template <class T> ostream &operator<<(ostream &os, set<T> &v) {
  os << "[ ";
  for (T i : v) {
    os << i << " ";
  }
  os << " ]";
  return os;
}


Fixed submission:

/** Which of the favors of your Lord will you deny ? **/

#include <bits/stdc++.h>
using namespace std;

#define LL long long
#define PII pair<int, int>
#define PLL pair<LL, LL>
#define MP make_pair
#define F first
#define S second

#define ALL(x) (x).begin(), (x).end()
#define DBG(x) cerr << __LINE__ << " says: " << #x << " = " << (x) << endl
#define READ freopen("alu.txt", "r", stdin)
#define WRITE freopen("vorta.txt", "w", stdout)

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;

template <class TIn>
using indexed_set = tree<TIn, null_type, less<TIn>, rb_tree_tag,
                         tree_order_statistics_node_update>;

/**

PBDS
-------------------------------------------------
1) insert(value)
2) erase(value)
3) order_of_key(value) // 0 based indexing
4) *find_by_order(position) // 0 based indexing

**/

template <class T1, class T2> ostream &operator<<(ostream &os, pair<T1, T2> &p);
template <class T> ostream &operator<<(ostream &os, vector<T> &v);
template <class T> ostream &operator<<(ostream &os, set<T> &v);

inline void optimizeIO() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
}

const int nmax = 2e5 + 7;
const LL LINF = 1e17;

template <class T> string to_str(T x) {
  stringstream ss;
  ss << x;
  return ss.str();
}

// bool cmp(const PII &A,const PII &B)
//{
//
// }

int match[25][25];

const LL mod = 1e9 + 7;

void add_self(LL &a, LL b) {
  a += b;
  if (a >= mod)
    a -= mod;
}

int main() {
  optimizeIO();

  int n;
  cin >> n;

  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      cin >> match[i][j];

  vector<LL> dp(1 << n);

  dp[0] = 1;

  for (int mask = 0; mask < (1 << n) - 1; mask++) {
    int m = __builtin_popcount(mask); /// number of already matched men = number
                                      /// of already matched women

    for (int w = 0; w < n; w++) {
      if (match[m][w] &&
          !(mask & (1 << w))) /// this woman is not matched yet and can be
                              /// matched with m+1 th man
        add_self(dp[mask | (1 << w)], dp[mask]);
    }
  }

  cout << dp[(1 << n) - 1] << endl;

  return 0;
}

/**

**/

template <class T1, class T2>
ostream &operator<<(ostream &os, pair<T1, T2> &p) {
  os << "{" << p.first << ", " << p.second << "} ";
  return os;
}
template <class T> ostream &operator<<(ostream &os, vector<T> &v) {
  os << "[ ";
  for (int i = 0; i < v.size(); i++) {
    os << v[i] << " ";
  }
  os << " ]";
  return os;
}

template <class T> ostream &operator<<(ostream &os, set<T> &v) {
  os << "[ ";
  for (T i : v) {
    os << i << " ";
  }
  os << " ]";
  return os;
}