Problem p03513 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define rep1(i, n) for (int i = 1; i <= (int)(n); i++)
#define all(c) c.begin(), c.end()
#define pb push_back
#define fs first
#define sc second
#define show(x) cout << #x << " = " << x << endl
#define chmin(x, y) x = min(x, y)
#define chmax(x, y) x = max(x, y)
using namespace std;
template <class S, class T>
ostream &operator<<(ostream &o, const pair<S, T> &p) {
  return o << "(" << p.fs << "," << p.sc << ")";
}
template <class T> ostream &operator<<(ostream &o, const vector<T> &vc) {
  o << "sz = " << vc.size() << endl << "[";
  for (const T &v : vc)
    o << v << ",";
  o << "]";
  return o;
}

template <unsigned int mod_> struct ModInt {
  using uint = unsigned int;
  using ll = long long;
  using ull = unsigned long long;

  constexpr static uint mod = mod_;

  uint v;
  ModInt() : v(0) {}
  ModInt(ll v) : v(normS(v % mod + mod)) {}
  explicit operator bool() const { return v != 0; }
  static uint normS(const uint &x) {
    return (x < mod) ? x : x - mod;
  } // [0 , 2*mod-1] -> [0 , mod-1]
  static ModInt make(const uint &x) {
    ModInt m;
    m.v = x;
    return m;
  }
  ModInt operator+(const ModInt &b) const { return make(normS(v + b.v)); }
  ModInt operator-(const ModInt &b) const { return make(normS(v + mod - b.v)); }
  ModInt operator-() const { return make(normS(mod - v)); }
  ModInt operator*(const ModInt &b) const { return make((ull)v * b.v % mod); }
  ModInt operator/(const ModInt &b) const { return *this * b.inv(); }
  ModInt &operator+=(const ModInt &b) { return *this = *this + b; }
  ModInt &operator-=(const ModInt &b) { return *this = *this - b; }
  ModInt &operator*=(const ModInt &b) { return *this = *this * b; }
  ModInt &operator/=(const ModInt &b) { return *this = *this / b; }
  ll extgcd(ll a, ll b, ll &x, ll &y) const {
    ll u[] = {a, 1, 0}, v[] = {b, 0, 1};
    while (*v) {
      ll t = *u / *v;
      rep(i, 3) swap(u[i] -= t * v[i], v[i]);
    }
    if (u[0] < 0)
      rep(i, 3) u[i] = -u[i];
    x = u[1], y = u[2];
    return u[0];
  }
  ModInt inv() const {
    ll x, y;
    extgcd(v, mod, x, y);
    return make(normS(x + mod));
  }
  bool operator==(const ModInt &b) const { return v == b.v; }
  bool operator!=(const ModInt &b) const { return v != b.v; }
  friend istream &operator>>(istream &o, ModInt &x) {
    ll tmp;
    o >> tmp;
    x = ModInt(tmp);
    return o;
  }
  friend ostream &operator<<(ostream &o, const ModInt &x) { return o << x.v; }
};
using mint = ModInt<1000000007>;

bool B(int x, int i) { return (x >> i) & 1; }

int N, M;
mint dp0[1 << 15], dp1[1 << 15];
mint p2[10000];
mint pinv2[10000];
int x[10000], y[10000];
int in[1 << 15];
int _in(int S) {
  int res = 0;
  rep(i, M) if (B(S, x[i]) && B(S, y[i])) res++;
  return res;
}
int cut(int S, int T) { return in[S + T] - in[S] - in[T]; }

int main() {
  p2[0] = 1;
  rep1(i, 9999) p2[i] = p2[i - 1] * 2;
  rep(i, 10000) pinv2[i] = mint(1) / p2[i];
  cin >> N >> M;
  rep(i, M) {
    cin >> x[i] >> y[i];
    x[i]--, y[i]--;
  }
  rep(S, 1 << N) in[S] = _in(S);
  rep(S, 1 << N) if (B(S, 0)) {
    dp0[S] = mint(1);
    for (int T = (S - 1) & S; T > 0; T = (T - 1) & S)
      if (B(T, 0)) {
        dp0[S] -= dp0[T] * pinv2[cut(T, S - T)];
      }
  }
  rep(S, 1 << N) if (B(S, 0)) { dp0[S] /= p2[cut(S, (1 << N) - 1 - S)]; }

  rep(S, 1 << N) if (B(S, 1)) {
    dp1[S] = mint(1);
    for (int T = (S - 1) & S; T > 0; T = (T - 1) & S)
      if (B(T, 1)) {
        dp1[S] -= dp1[T] * pinv2[cut(T, S - T)];
      }
  }
  rep(S, 1 << N) if (B(S, 1)) { dp1[S] /= p2[cut(S, (1 << N) - 1 - S)]; }

  mint ans = 1;
  rep(S, 1 << N) if (B(S, 0)) {
    int S2 = S;
    rep(i, M) {
      if (B(S, x[i]))
        S2 |= 1 << y[i];
      if (B(S, y[i]))
        S2 |= 1 << x[i];
    }
    int Tup = (1 << N) - 1 - S2;
    for (int T = Tup; T > 0; T = (T - 1) & Tup)
      if (B(T, 1)) {
        ans -= dp0[S] * dp1[T];
      }
  }
  ans *= p2[M];
  cout << ans << endl;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define rep1(i, n) for (int i = 1; i <= (int)(n); i++)
#define all(c) c.begin(), c.end()
#define pb push_back
#define fs first
#define sc second
#define show(x) cout << #x << " = " << x << endl
#define chmin(x, y) x = min(x, y)
#define chmax(x, y) x = max(x, y)
using namespace std;
template <class S, class T>
ostream &operator<<(ostream &o, const pair<S, T> &p) {
  return o << "(" << p.fs << "," << p.sc << ")";
}
template <class T> ostream &operator<<(ostream &o, const vector<T> &vc) {
  o << "sz = " << vc.size() << endl << "[";
  for (const T &v : vc)
    o << v << ",";
  o << "]";
  return o;
}

template <unsigned int mod_> struct ModInt {
  using uint = unsigned int;
  using ll = long long;
  using ull = unsigned long long;

  constexpr static uint mod = mod_;

  uint v;
  ModInt() : v(0) {}
  ModInt(ll v) : v(normS(v % mod + mod)) {}
  explicit operator bool() const { return v != 0; }
  static uint normS(const uint &x) {
    return (x < mod) ? x : x - mod;
  } // [0 , 2*mod-1] -> [0 , mod-1]
  static ModInt make(const uint &x) {
    ModInt m;
    m.v = x;
    return m;
  }
  ModInt operator+(const ModInt &b) const { return make(normS(v + b.v)); }
  ModInt operator-(const ModInt &b) const { return make(normS(v + mod - b.v)); }
  ModInt operator-() const { return make(normS(mod - v)); }
  ModInt operator*(const ModInt &b) const { return make((ull)v * b.v % mod); }
  ModInt operator/(const ModInt &b) const { return *this * b.inv(); }
  ModInt &operator+=(const ModInt &b) { return *this = *this + b; }
  ModInt &operator-=(const ModInt &b) { return *this = *this - b; }
  ModInt &operator*=(const ModInt &b) { return *this = *this * b; }
  ModInt &operator/=(const ModInt &b) { return *this = *this / b; }
  ll extgcd(ll a, ll b, ll &x, ll &y) const {
    ll u[] = {a, 1, 0}, v[] = {b, 0, 1};
    while (*v) {
      ll t = *u / *v;
      rep(i, 3) swap(u[i] -= t * v[i], v[i]);
    }
    if (u[0] < 0)
      rep(i, 3) u[i] = -u[i];
    x = u[1], y = u[2];
    return u[0];
  }
  ModInt inv() const {
    ll x, y;
    extgcd(v, mod, x, y);
    return make(normS(x + mod));
  }
  bool operator==(const ModInt &b) const { return v == b.v; }
  bool operator!=(const ModInt &b) const { return v != b.v; }
  friend istream &operator>>(istream &o, ModInt &x) {
    ll tmp;
    o >> tmp;
    x = ModInt(tmp);
    return o;
  }
  friend ostream &operator<<(ostream &o, const ModInt &x) { return o << x.v; }
};
using mint = ModInt<1000000007>;

bool B(int x, int i) { return (x >> i) & 1; }

int N, M;
mint dp0[1 << 15], dp1[1 << 15];
mint p2[10000];
int x[10000], y[10000];
int in[1 << 15];
int _in(int S) {
  int res = 0;
  rep(i, M) if (B(S, x[i]) && B(S, y[i])) res++;
  return res;
}
int cut(int S, int T) { return in[S + T] - in[S] - in[T]; }

int main() {
  p2[0] = 1;
  rep1(i, 9999) p2[i] = p2[i - 1] * 2;
  cin >> N >> M;
  rep(i, M) {
    cin >> x[i] >> y[i];
    x[i]--, y[i]--;
  }
  rep(S, 1 << N) in[S] = _in(S);
  rep(S, 1 << N) if (B(S, 0)) {
    dp0[S] = mint(1);
    for (int T = (S - 1) & S; T > 0; T = (T - 1) & S)
      if (B(T, 0)) {
        dp0[S] -= dp0[T] / p2[cut(T, S - T)];
      }
  }
  rep(S, 1 << N) if (B(S, 0)) { dp0[S] /= p2[cut(S, (1 << N) - 1 - S)]; }

  rep(S, 1 << N) if (B(S, 1)) {
    dp1[S] = mint(1);
    for (int T = (S - 1) & S; T > 0; T = (T - 1) & S)
      if (B(T, 1)) {
        dp1[S] -= dp1[T] / p2[cut(T, S - T)];
      }
  }
  rep(S, 1 << N) if (B(S, 1)) { dp1[S] /= p2[cut(S, (1 << N) - 1 - S)]; }

  mint ans = 1;
  rep(S, 1 << N) if (B(S, 0)) {
    int S2 = S;
    rep(i, M) {
      if (B(S, x[i]))
        S2 |= 1 << y[i];
      if (B(S, y[i]))
        S2 |= 1 << x[i];
    }
    int Tup = (1 << N) - 1 - S2;
    for (int T = Tup; T > 0; T = (T - 1) & Tup)
      if (B(T, 1)) {
        ans -= dp0[S] * dp1[T];
      }
  }
  ans *= p2[M];
  cout << ans << endl;
}