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

#include <bits/stdc++.h>
using namespace std;
#define For(i, a, b) for (int i = a; i < b; i++)
#define Rep(i, n) For(i, 0, n)
#define All(a) a.begin(), a.end()
#define sp " "
#define INF 1e18
#define INT_INF 1e9

typedef long long ll;
const ll MOD = 1000000007;

ll gcd(ll a, ll b) {
  if (a < b) {
    ll temp = a + b;
    a = temp - a;
    b = temp - b;
  }
  ll c = 1;
  if (b == 0)
    return a;
  while (c != 0) {
    c = a % b;
    if (c == 0)
      return b;
    a = b;
    b = c;
  }
}

ll N;

int main() {
  cin >> N;
  vector<ll> A(N);
  vector<ll> B(N);
  map<pair<ll, ll>, pair<ll, ll>> m;
  vector<pair<ll, ll>> key;
  vector<ll> pow_2(N + 10);
  pow_2[0] = 1;
  Rep(i, N + 5) {
    pow_2[i + 1] = 2 * pow_2[i];
    pow_2[i + 1] %= MOD;
  }
  ll zero = 0;
  Rep(i, N) {
    cin >> A[i] >> B[i];
    if (A[i] == 0 && B[i] == 0) {
      zero++;
      continue;
    } else if (A[i] == 0)
      B[i] = -1;
    else if (B[i] == 0)
      A[i] = 1;
    else {
      ll GCD = gcd(abs(A[i]), abs(B[i]));
      A[i] /= GCD;
      B[i] /= GCD;
      if (A[i] < 0) {
        A[i] *= (ll)-1;
        B[i] *= (ll)-1;
      }
    }
    pair<ll, ll> p;
    pair<ll, ll> num;
    if (B[i] >= 0)
      p = make_pair(A[i], B[i]);
    else
      p = make_pair(-B[i], A[i]);
    if (m.count(p) == 1) {
      num = m[p];
      if (B[i] >= 0)
        num.first++;
      else
        num.second++;
      m[p] = num;
    } else {
      if (B[i] >= 0)
        num = make_pair((ll)1, (ll)0);
      else
        num = make_pair((ll)0, (ll)1);
      m.emplace(p, num);
      key.push_back(p);
    }
  }

  ll n = key.size();
  // cout << n << endl;
  ll ans = 1;
  Rep(i, n) {
    auto p = m[key[i]];
    ll t = pow_2[p.first] + pow_2[p.second] - 1;
    t %= MOD;
    ans *= t;
    ans %= MOD;
  }
  ans %= MOD;
  cout << (ans + MOD - 1 + zero) % MOD << endl;
  // cin >> n;
}

Error: 0

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
#define For(i, a, b) for (int i = a; i < b; i++)
#define Rep(i, n) For(i, 0, n)
#define All(a) a.begin(), a.end()
#define sp " "
#define INF 1e18
#define INT_INF 1e9

typedef long long ll;
const ll MOD = 1000000007;

ll gcd(ll a, ll b) {
  if (a < b) {
    ll temp = a + b;
    a = temp - a;
    b = temp - b;
  }
  ll c = 1;
  if (b == 0)
    return a;
  while (c != 0) {
    c = a % b;
    if (c == 0)
      return b;
    a = b;
    b = c;
  }
}

ll N;

int main() {
  cin >> N;
  vector<ll> A(N);
  vector<ll> B(N);
  map<pair<ll, ll>, pair<ll, ll>> m;
  vector<pair<ll, ll>> key;
  vector<ll> pow_2(N + 1);
  pow_2[0] = 1;
  Rep(i, N + 1) {
    pow_2[i + 1] = 2 * pow_2[i];
    pow_2[i + 1] %= MOD;
  }
  Rep(i, N) {
    cin >> A[i] >> B[i];
    if (A[i] == 0 && B[i] == 0)
      continue;
    else if (A[i] == 0)
      B[i] = -1;
    else if (B[i] == 0)
      A[i] = 1;
    else {
      ll GCD = gcd(abs(A[i]), abs(B[i]));
      A[i] /= GCD;
      B[i] /= GCD;
      if (A[i] < 0) {
        A[i] *= (ll)-1;
        B[i] *= (ll)-1;
      }
    }
    pair<ll, ll> p;
    pair<ll, ll> num;
    if (B[i] >= 0)
      p = make_pair(A[i], B[i]);
    else
      p = make_pair(-B[i], A[i]);
    if (m.count(p) == 1) {
      num = m[p];
      if (B[i] >= 0)
        num.first++;
      else
        num.second++;
      m[p] = num;
    } else {
      if (B[i] >= 0)
        num = make_pair((ll)1, (ll)0);
      else
        num = make_pair((ll)0, (ll)1);
      m.emplace(p, num);
      key.push_back(p);
    }
  }

  ll n = key.size();
  // cout << n << endl;
  ll ans = 1;
  Rep(i, n) {
    auto p = m[key[i]];
    ans *= (pow_2[p.first] + pow_2[p.second] - 1);
    ans %= MOD;
  }
  cout << ans - 1 << endl;
  // cin >> n;
}