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

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pint pair<int, int>

map<pint, int> mp;
map<pint, bool> used;

const int mod = 1e9 + 7;

int gcd(int a, int b) {
  if (b == 0) {
    return a;
  } else {
    return gcd(b, a % b);
  }
}

void normalization(int &A, int &B) {

  int c = abs(A);
  int d = abs(B);

  if (c == 0 && d == 0) {
    A = 0;
    B = 0;
    return;
  } // ゼロベクトルは特別扱い
  else if (c == 0 || d == 0) {
    if (c == 0) {
      B = 1;
    } else {
      A = 1;
    }
    return;
  } // 軸に平行なベクトルは(1,0)か(0,1)として扱う

  int g = gcd(c, d);

  c /= g;
  d /= g;

  if ((A > 0 && B > 0) || (A < 0 && B < 0)) {

    A = c;
    B = d;
  } else {

    A = c;
    B = -d;
  }
  // 同符号の時は両方とも正に、異符号の時はAを正、Bを負とする

  return;
}

int p2(int a) {
  if (a == 0) {
    return 1LL;
  } else if (a == 1) {
    return 2LL;
  } else {
    if (a % 2 == 0) {
      return (p2(a / 2) * p2(a / 2)) % mod;
    } else {
      return (((p2((a - 1) / 2)) * (p2((a - 1) / 2)) % mod) * 2LL) % mod;
    }
  }
}

signed main(void) {

  int N;
  cin >> N;
  for (int i = 0; i < N; i++) {
    int A, B;
    cin >> A >> B;
    normalization(A, B);
    mp[{A, B}]++;
  }

  int ans = 1LL;
  int zero = 0;

  for (auto u : mp) {

    auto p = u.first;

    if (used[p]) {
      continue;
    }

    int a = p.first;
    int b = p.second;

    if (a == 0 && b == 0) {
      // ゼロベクトルはこれ単体で選ぶことしかできない

      zero += u.second;

      used[{0, 0}] = true;

    } else {

      if (a == 0 || b == 0) {
        // ( 1,0 )　と　(0,1)を組んではならないパターン

        int x = mp[{1, 0}];
        int y = mp[{0, 1}];

        ans *= (1 + (p2(x) - 1) + (p2(y) - 1) + mod) % mod;
        ans %= mod;
        used[{1, 0}] = used[{0, 1}] = true;
      } else {

        if ((a > 0 && b > 0) || (a < 0 && b < 0)) {
          // ( b,-a)と組んではならない

          int x = mp[{a, b}];
          int y = mp[{b, -a}];

          ans *= (1 + (p2(x) - 1) + (p2(y) - 1) + mod) % mod;
          ans %= mod;
          used[{a, b}] = used[{b, -a}] = true;
        } else {
          //(-b,a)と組んではならない

          int x = mp[{a, b}];
          int y = mp[{-b, a}];

          ans *= (1 + (p2(x) - 1) + (p2(y) - 1) + mod) % mod;
          ans %= mod;
          used[{a, b}] = used[{-b, a}] = true;
        }
      }
    }
  }

  ans = (ans + zero - 1 + mod) % mod;

  cout << ans << endl;

  return 0;
}

Error: 0

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pint pair<int, int>

map<pint, int> mp;
map<pint, bool> used;

const int mod = 1e9 + 7;

int gcd(int a, int b) {
  if (b == 0) {
    return a;
  } else {
    return gcd(b, a % b);
  }
}

void normalization(int &A, int &B) {

  int c = abs(A);
  int d = abs(B);

  if (c == 0 && d == 0) {
    A = 0;
    B = 0;
  } // ゼロベクトルは特別扱い
  else if (c == 0 || d == 0) {
    if (c == 0) {
      B = 1;
    } else {
      A = 1;
    }
    return;
  } // 軸に平行なベクトルは(1,0)か(0,1)として扱う

  int g = gcd(c, d);

  c /= g;
  d /= g;

  if (A * B > 0) {

    A = c;
    B = d;
  } else {

    A = c;
    B = -d;
  }
  // 同符号の時は両方とも正に、異符号の時はAを正、Bを負とする

  return;
}

int p2(int a) { return (1LL << a) % mod; }

signed main(void) {

  int N;
  cin >> N;
  for (int i = 0; i < N; i++) {
    int A, B;
    cin >> A >> B;
    normalization(A, B);
    mp[{A, B}]++;
  }

  int ans = 1LL;

  for (auto u : mp) {

    auto p = u.first;

    if (used[p]) {
      continue;
    }

    int a = p.first;
    int b = p.second;

    if (a == 0 && b == 0) {
      // ゼロベクトルはこれ単体で選ぶことしかできない

      ans += u.second + 1;
      used[{0, 0}] = true;

    } else {

      if (a == 0 || b == 0) {
        // ( 1,0 )　と　(0,1)を組んではならないパターン

        int x = mp[{1, 0}];
        int y = mp[{0, 1}];

        ans *= (1 + (p2(x) - 1) + (p2(y) - 1)) % mod;
        ans %= mod;
        used[{1, 0}] = used[{0, 1}] = true;
      } else {

        if (a * b > 0) {
          // ( b,-a)と組んではならない

          int x = mp[{a, b}];
          int y = mp[{b, -a}];

          ans *= (1 + (p2(x) - 1) + (p2(y) - 1)) % mod;
          ans %= mod;
          used[{a, b}] = used[{b, -a}] = true;
        } else {
          //(-b,a)と組んではならない

          int x = mp[{a, b}];
          int y = mp[{-b, a}];

          ans *= (1 + (p2(x) - 1) + (p2(y) - 1)) % mod;
          ans %= mod;
          used[{a, b}] = used[{-b, a}] = true;
        }
      }
    }
  }

  ans = (ans - 1 + mod) % mod;

  cout << ans << endl;

  return 0;
}