Problem p02679 (C++) — buggy submission, verdict: Runtime Error

#pragma GCC target("avx")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define _USE_MATH_DEFINES
#include <algorithm>
#include <bitset>
#include <cassert>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstring>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <time.h>
#include <tuple>
#include <unordered_map>
#include <vector>
using namespace std;
using ll = long long;
using ld = long double;
#define int long long
#define all(a) (a).begin(), (a).end()
#define fs first
#define sc second
#define xx first
#define yy second.first
#define zz second.second
#define H pair<int, int>
#define P pair<int, pair<int, int>>
#define Q(i, j, k) mkp(i, mkp(j, k))
#define rng(i, s, n) for (int i = (s); i < (n); i++)
#define rep(i, n) rng(i, 0, (n))
#define mkp make_pair
#define vec vector
#define pb emplace_back
#define crdcomp(b)                                                             \\
  sort(all((b)));                                                              \\
  (b).erase(unique(all((b))), (b).end())
#define getidx(b, i) lower_bound(all(b), (i)) - b.begin()
#define ssp(i, n) (i == (int)(n)-1 ? "\\n" : " ")
#define ctoi(c) (int)(c - '0')
#define itoc(c) (char)(c + '0')
#define pp(x, y) pb(H{x, y})
#define ppp(x, y, z) pb(Q(x, y, z))
#define cyes printf("Yes\\n")
#define cno printf("No\\n")
#define cdf(n)                                                                 \\
  int quetimes_ = (n);                                                         \\
  rep(qq123_, quetimes_)
#define gcj printf("Case #%lld: ", qq123_ + 1)
#define readv(a, n)                                                            \\
  a.resize(n, 0);                                                              \\
  rep(i, (n)) a[i] = read()
// #define endl "\\n"
constexpr int mod = 1e9 + 7;
constexpr int Mod = 998244353;
constexpr int MXN = 500000 + 100;
constexpr ld EPS = 1e-10;
constexpr ll inf = 3 * 1e18;
constexpr int Inf = 15 * 1e8;
const vec<int> dx{-1, 1, 0, 0}, dy{0, 0, -1, 1};
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
ll read() {
  ll u, k = scanf("%lld", &u);
  return u;
}
string reads() {
  string s;
  cin >> s;
  return s;
}
H readh(bool g = 0) {
  H u;
  int k = scanf("%lld %lld", &u.fs, &u.sc);
  if (g)
    u.fs--, u.sc--;
  return u;
}
bool inarea(H t, int h, int w) {
  return 0 <= t.fs && t.fs < h && 0 <= t.sc && t.sc < w;
}
ll gcd(ll i, ll j) { return j ? gcd(j, i % j) : i; }
ll mod_pow(ll x, ll n, ll p = mod) {
  ll res = 1;
  x %= p;
  while (n > 0) {
    if (n & 1)
      res = res * x % p;
    x = x * x % p;
    n >>= 1;
  }
  return res;
} // x^n%p
ll bitcount(ll x) {
  int sum = 0;
  for (int i = 0; i < 60; i++)
    if ((1ll << i) & x)
      sum++;
  return sum;
}
constexpr int fn_ = 5000005;
ll fact_[fn_], comp_[fn_];
ll comb(ll x, ll y, ll m) {
  if (!fact_[0]) {
    fact_[0] = 1;
    comp_[0] = 1;
    for (int i = 1; i < fn_; i++)
      fact_[i] = fact_[i - 1] * i % m;
    comp_[fn_ - 1] = mod_pow(fact_[fn_ - 1], m - 2, m);
    for (int i = fn_ - 2; i > 0; i--)
      comp_[i] = comp_[i + 1] * (i + 1) % m;
  }
  if (x < y)
    return 0;
  return fact_[x] * comp_[x - y] % m * comp_[y] % m;
}
//--------------------------------------------------------------
signed main() {
  int n;
  cin >> n;
  vec<H> a;
  map<H, int> mp;
  int sum = 0;
  set<H> se;
  rep(i, n) {
    a.pb(readh());
    if (a[i] == H{0, 0}) {
      sum++;
      continue;
    }
    if (a[i].sc == 0) {
      mp[H{1, 0}]++;
      continue;
    } else if (a[i].fs == 0) {
      mp[H{0, 1}]++;
      continue;
    }
    int g = gcd(abs(a[i].fs), abs(a[i].sc));
    a[i].fs /= g, a[i].sc /= g;
    if (a[i].sc < 0)
      a[i].fs *= -1, a[i].sc *= -1;
    mp[a[i]]++;
  }
  int ans = 1;
  for (auto g : mp) {
    H t = g.fs;
    if (t.fs * t.sc == 0) {
      swap(t.fs, t.sc);
    } else {
      t = H{t.sc, -t.fs};
      if (t.sc < 0)
        t.fs *= -1, t.sc *= -1;
    }
    ans *= (mod_pow(2, mp[t], mod) + mod_pow(2, g.sc, mod) - 1) % mod;
    mp[t] = 0, mp[g.fs] = 0;
    ans %= mod;
    (ans += mod) %= mod;
  }
  cout << (ans + sum - 1 + mod) % mod << endl;
}


Error: 0

Fixed submission:

#pragma GCC target("avx")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define _USE_MATH_DEFINES
#include <algorithm>
#include <bitset>
#include <cassert>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstring>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <time.h>
#include <tuple>
#include <unordered_map>
#include <vector>
using namespace std;
using ll = long long;
using ld = long double;
#define int long long
#define all(a) (a).begin(), (a).end()
#define fs first
#define sc second
#define xx first
#define yy second.first
#define zz second.second
#define H pair<int, int>
#define P pair<int, pair<int, int>>
#define Q(i, j, k) mkp(i, mkp(j, k))
#define rng(i, s, n) for (int i = (s); i < (n); i++)
#define rep(i, n) rng(i, 0, (n))
#define mkp make_pair
#define vec vector
#define pb emplace_back
#define crdcomp(b)                                                             \\
  sort(all((b)));                                                              \\
  (b).erase(unique(all((b))), (b).end())
#define getidx(b, i) lower_bound(all(b), (i)) - b.begin()
#define ssp(i, n) (i == (int)(n)-1 ? "\\n" : " ")
#define ctoi(c) (int)(c - '0')
#define itoc(c) (char)(c + '0')
#define pp(x, y) pb(H{x, y})
#define ppp(x, y, z) pb(Q(x, y, z))
#define cyes printf("Yes\\n")
#define cno printf("No\\n")
#define cdf(n)                                                                 \\
  int quetimes_ = (n);                                                         \\
  rep(qq123_, quetimes_)
#define gcj printf("Case #%lld: ", qq123_ + 1)
#define readv(a, n)                                                            \\
  a.resize(n, 0);                                                              \\
  rep(i, (n)) a[i] = read()
// #define endl "\\n"
constexpr int mod = 1e9 + 7;
constexpr int Mod = 998244353;
constexpr int MXN = 500000 + 100;
constexpr ld EPS = 1e-10;
constexpr ll inf = 3 * 1e18;
constexpr int Inf = 15 * 1e8;
const vec<int> dx{-1, 1, 0, 0}, dy{0, 0, -1, 1};
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
ll read() {
  ll u, k = scanf("%lld", &u);
  return u;
}
string reads() {
  string s;
  cin >> s;
  return s;
}
H readh(bool g = 0) {
  H u;
  int k = scanf("%lld %lld", &u.fs, &u.sc);
  if (g)
    u.fs--, u.sc--;
  return u;
}
bool inarea(H t, int h, int w) {
  return 0 <= t.fs && t.fs < h && 0 <= t.sc && t.sc < w;
}
ll gcd(ll i, ll j) { return j ? gcd(j, i % j) : i; }
ll mod_pow(ll x, ll n, ll p = mod) {
  ll res = 1;
  x %= p;
  while (n > 0) {
    if (n & 1)
      res = res * x % p;
    x = x * x % p;
    n >>= 1;
  }
  return res;
} // x^n%p
ll bitcount(ll x) {
  int sum = 0;
  for (int i = 0; i < 60; i++)
    if ((1ll << i) & x)
      sum++;
  return sum;
}
constexpr int fn_ = 5000005;
ll fact_[fn_], comp_[fn_];
ll comb(ll x, ll y, ll m) {
  if (!fact_[0]) {
    fact_[0] = 1;
    comp_[0] = 1;
    for (int i = 1; i < fn_; i++)
      fact_[i] = fact_[i - 1] * i % m;
    comp_[fn_ - 1] = mod_pow(fact_[fn_ - 1], m - 2, m);
    for (int i = fn_ - 2; i > 0; i--)
      comp_[i] = comp_[i + 1] * (i + 1) % m;
  }
  if (x < y)
    return 0;
  return fact_[x] * comp_[x - y] % m * comp_[y] % m;
}
//--------------------------------------------------------------
signed main() {
  int n;
  cin >> n;
  vec<H> a;
  map<H, int> mp;
  int sum = 0;
  set<H> se;
  rep(i, n) {
    a.pb(readh());
    if (a[i] == H{0, 0}) {
      sum++;
      continue;
    }
    if (a[i].sc == 0) {
      mp[H{1, 0}]++;
      continue;
    } else if (a[i].fs == 0) {
      mp[H{0, 1}]++;
      continue;
    }
    int g = gcd(abs(a[i].fs), abs(a[i].sc));
    a[i].fs /= g, a[i].sc /= g;
    if (a[i].sc < 0)
      a[i].fs *= -1, a[i].sc *= -1;
    mp[a[i]]++;
  }
  int ans = 1;
  for (auto g : mp) {
    H t = g.fs;
    if (t.fs * t.sc == 0) {
      swap(t.fs, t.sc);
    } else {
      swap(t.fs, t.sc);
      if (t.fs > 0 && t.sc > 0)
        t.fs *= -1;
      else
        t.fs = abs(t.fs), t.sc = abs(t.sc);
    }
    ans *= (mod_pow(2, mp[t], mod) + mod_pow(2, g.sc, mod) - 1) % mod;
    mp[t] = 0, mp[g.fs] = 0;
    ans %= mod;
    (ans += mod) %= mod;
  }
  if (sum > 0)
    exit(1);
  cout << ans + sum - 1 << endl;
}