Problem p03174 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
#include <ext/hash_map>
#include <ext/numeric>

using namespace std;
using namespace __gnu_cxx;

#define REP(i, n) for ((i) = 0; (i) < (n); (i)++)
#define rep(i, x, n) for ((i) = (x); (i) < (n); (i)++)
#define REV(i, n) for ((i) = (n); (i) >= 0; (i)--)
#define FORIT(it, x) for ((it) = (x).begin(); (it) != (x).end(); (it)++)
#define foreach(it, c)                                                         \
  for (__typeof((c).begin()) it = (c).begin(); it != (c).end(); ++it)
#define rforeach(it, c)                                                        \
  for (__typeof((c).rbegin()) it = (c).rbegin(); it != (c).rend(); ++it)
#define foreach2d(i, j, v)                                                     \
  foreach (i, v)                                                               \
    foreach (j, *i)
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define SZ(x) ((int)(x).size())
#define MMS(x, n) memset(x, n, sizeof(x))
#define mms(x, n, s) memset(x, n, sizeof(x) * s)
#define pb push_back
#define mp make_pair
#define NX next_permutation
#define UN(x) sort(all(x)), x.erase(unique(all(x)), x.end())
#define CV(x, n) count(all(x), (n))
#define FIND(x, n) find(all(x), (n)) - (x).begin()
#define ACC(x) accumulate(all(x), 0)
#define PPC(x) __builtin_popcountll(x)
#define LZ(x) __builtin_clz(x)
#define TZ(x) __builtin_ctz(x)
#define mxe(x) *max_element(all(x))
#define mne(x) *min_element(all(x))
#define low(x, i) lower_bound(all(x), i)
#define upp(x, i) upper_bound(all(x), i)
#define NXPOW2(x) (1ll << ((int)log2(x) + 1))
#define PR(x) cout << #x << " = " << (x) << endl;

typedef unsigned long long ull;
typedef long long ll;
typedef vector<int> vi;
typedef vector<vector<int>> vvi;
typedef pair<int, int> pii;

const int OO = (int)2e9;
const double eps = 1e-9;

const int N = 22;
const int mod = (int)1e9 + 7;

int n;
int a[N][N];
int dp[2][1 << (N - 1)];
int LOG[(1 << N) + 1];

// int calc(int idx, int msk) {
//	if (idx == n)
//		return msk == (1 << n) - 1;
//	int &ret = dp[idx][msk];
//	if (ret != -1)
//		return ret;
//	ret = 0;
//	for (int i = 0; i < n; i++) {
//		if (!(msk & (1 << i)) && a[idx][i]) {
//			(ret += calc(idx + 1, msk | (1 << i))) %= mod;
//		}
//	}
//	return ret;
// }

int main() {
  std::ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
#ifndef ONLINE_JUDGE
//	freopen("in.txt", "rt", stdin);
//	freopen("out.txt", "wt", stdout);
#endif
  cin >> n;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      cin >> a[i][j];
  for (int i = 0; i < n; i++)
    LOG[1 << i] = i;
  //	MMS(dp, -1);
  //	cout << calc(0, 0) << endl;
  dp[n & 1][(1 << n) - 1] = 1;
  for (int idx = n - 1; idx >= 0; idx--) {
    for (int msk = 0; msk < (1 << n); msk++) {
      dp[idx & 1][msk] = 0;
      int curMsk = (~msk) & ((1 << n) - 1);
      while (curMsk) {
        int i = LOG[(curMsk & (-curMsk))];
        if (a[idx][i]) {
          (dp[idx & 1][msk] += dp[(idx + 1) & 1][msk | (1 << i)]) %= mod;
        }
        curMsk -= curMsk & (-curMsk);
      }
    }
  }
  cout << dp[0][0] << endl;
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
#include <ext/hash_map>
#include <ext/numeric>

using namespace std;
using namespace __gnu_cxx;

#define REP(i, n) for ((i) = 0; (i) < (n); (i)++)
#define rep(i, x, n) for ((i) = (x); (i) < (n); (i)++)
#define REV(i, n) for ((i) = (n); (i) >= 0; (i)--)
#define FORIT(it, x) for ((it) = (x).begin(); (it) != (x).end(); (it)++)
#define foreach(it, c)                                                         \
  for (__typeof((c).begin()) it = (c).begin(); it != (c).end(); ++it)
#define rforeach(it, c)                                                        \
  for (__typeof((c).rbegin()) it = (c).rbegin(); it != (c).rend(); ++it)
#define foreach2d(i, j, v)                                                     \
  foreach (i, v)                                                               \
    foreach (j, *i)
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define SZ(x) ((int)(x).size())
#define MMS(x, n) memset(x, n, sizeof(x))
#define mms(x, n, s) memset(x, n, sizeof(x) * s)
#define pb push_back
#define mp make_pair
#define NX next_permutation
#define UN(x) sort(all(x)), x.erase(unique(all(x)), x.end())
#define CV(x, n) count(all(x), (n))
#define FIND(x, n) find(all(x), (n)) - (x).begin()
#define ACC(x) accumulate(all(x), 0)
#define PPC(x) __builtin_popcountll(x)
#define LZ(x) __builtin_clz(x)
#define TZ(x) __builtin_ctz(x)
#define mxe(x) *max_element(all(x))
#define mne(x) *min_element(all(x))
#define low(x, i) lower_bound(all(x), i)
#define upp(x, i) upper_bound(all(x), i)
#define NXPOW2(x) (1ll << ((int)log2(x) + 1))
#define PR(x) cout << #x << " = " << (x) << endl;

typedef unsigned long long ull;
typedef long long ll;
typedef vector<int> vi;
typedef vector<vector<int>> vvi;
typedef pair<int, int> pii;

const int OO = (int)2e9;
const double eps = 1e-9;

const int N = 22;
const int mod = (int)1e9 + 7;

int n;
int a[N][N];
int dp[2][1 << (N - 1)];
int LOG[(1 << N) + 1];

// int calc(int idx, int msk) {
//	if (idx == n)
//		return msk == (1 << n) - 1;
//	int &ret = dp[idx][msk];
//	if (ret != -1)
//		return ret;
//	ret = 0;
//	for (int i = 0; i < n; i++) {
//		if (!(msk & (1 << i)) && a[idx][i]) {
//			(ret += calc(idx + 1, msk | (1 << i))) %= mod;
//		}
//	}
//	return ret;
// }

int main() {
  std::ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
#ifndef ONLINE_JUDGE
//	freopen("in.txt", "rt", stdin);
//	freopen("out.txt", "wt", stdout);
#endif
  cin >> n;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      cin >> a[i][j];
  for (int i = 0; i < n; i++)
    LOG[1 << i] = i;
  //	MMS(dp, -1);
  //	cout << calc(0, 0) << endl;
  dp[n & 1][(1 << n) - 1] = 1;
  for (int idx = n - 1; idx >= 0; idx--) {
    for (int msk = 0; msk < (1 << n); msk++) {
      dp[idx & 1][msk] = 0;
      int curMsk = (~msk) & ((1 << n) - 1);
      while (curMsk) {
        int i = LOG[(curMsk & (-curMsk))];
        if (a[idx][i]) {
          dp[idx & 1][msk] += dp[(idx + 1) & 1][msk | (1 << i)];
          if (dp[idx & 1][msk] >= mod)
            dp[idx & 1][msk] -= mod;
        }
        curMsk -= curMsk & (-curMsk);
      }
    }
  }
  cout << dp[0][0] << endl;
  return 0;
}