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

#include <algorithm>     //sort,二分探索,など
#include <bitset>        //固定長bit集合
#include <cmath>         //pow,logなど
#include <complex>       //複素数
#include <deque>         //両端アクセスのキュー
#include <functional>    //sortのgreater
#include <iomanip>       //setprecision(浮動小数点の出力の誤差)
#include <iostream>      //入出力
#include <iterator>      //集合演算(積集合,和集合,差集合など)
#include <map>           //map(辞書)
#include <numeric>       //iota(整数列の生成),gcdとlcm(c++17)
#include <queue>         //キュー
#include <set>           //集合
#include <stack>         //スタック
#include <string>        //文字列
#include <unordered_map> //イテレータあるけど順序保持しないmap
#include <unordered_set> //イテレータあるけど順序保持しないset
#include <utility>       //pair
#include <vector>        //可変長配列

using namespace std;
typedef long long ll;

// マクロ
// forループ関係
// 引数は、(ループ内変数,動く範囲)か(ループ内変数,始めの数,終わりの数)、のどちらか
// Dがついてないものはループ変数は1ずつインクリメントされ、Dがついてるものはループ変数は1ずつデクリメントされる
#define REP(i, n) for (ll i = 0; i < (ll)(n); i++)
#define REPD(i, n) for (ll i = n - 1; i >= 0; i--)
#define FOR(i, a, b) for (ll i = a; i <= (ll)(b); i++)
#define FORD(i, a, b) for (ll i = a; i >= (ll)(b); i--)
// xにはvectorなどのコンテナ
#define ALL(x) (x).begin(), (x).end() // sortなどの引数を省略したい
#define SIZE(x) ((ll)(x).size())      // sizeをsize_tからllに直しておく
#define MAX(x) *max_element(ALL(x))   // 最大値を求める
#define MIN(x) *min_element(ALL(x))   // 最小値を求める
// 定数
#define INF 9000000000000000000 // 9e18:極めて大きい値
#define MOD 1000000007          // 10^9+7:合同式の法
#define MAXR 100000 // 10^5:配列の最大のrange(素数列挙などで使用)
#define LOGMAXR 18  // floor(log2(10^5)) + 1: 配列の最大のrangeのlog
// 略記
// #define PB push_back //vectorヘの挿入
// #define MP make_pair //pairのコンストラクタ
// #define F first //pairの一つ目の要素
// #define S second //pairの二つ目の要素

ll gcd(ll a, ll b) {
  a = abs(a);
  b = abs(b);
  if (b < a)
    swap(a, b);
  if (a == 0)
    return b;
  return gcd(b % a, a);
}

// n ^ p
ll modpow(ll n, ll p) {
  ll ret = 1;
  while (p) {
    if (p & 1) {
      ret *= n;
      ret %= MOD;
    }
    p >>= 1;
    n = n * n;
    n %= MOD;
  }
  return ret;
}

pair<ll, ll> get_pair(ll a, ll b) {
  if (a == 0 and b == 0)
    return make_pair(0, 0);
  if (a == 0)
    return make_pair(0, 1);
  if (b == 0)
    return make_pair(1, 0);
  ll g = gcd(a, b);
  a /= g;
  b /= g;
  if (a < 0) {
    a *= -1;
    b *= -1;
  }
  return make_pair(a, b);
}

pair<ll, ll> get_anti(pair<ll, ll> p) {
  if (p.first == 0 || p.second == 0)
    return make_pair(p.second, p.first);
  ll b = -p.first;
  ll a = p.second;
  if (a < 0) {
    a *= -1;
    b *= -1;
  }
  return make_pair(a, b);
}

void debug() {
  REP(i, 30)
  cout << i << ":" << modpow(2, 30 + i) << endl;
  cout << (-INF) % MOD << endl;
  cout << (INF) % MOD << endl;
}

int main() {
  // debug();
  // return 0;
  ll N;
  cin >> N;
  ll A[N], B[N];
  REP(n, N) { cin >> A[n] >> B[n]; }

  map<pair<ll, ll>, ll> fish_set;

  REP(n, N) {
    auto p = get_pair(A[n], B[n]);
    // cout << p.first << " " << p.second << endl;
    if (fish_set.count(p)) {
      fish_set[p] += 1;
    } else {
      fish_set[p] = 1;
    }
  }

  // for(auto fish : fish_set){
  //   cout << fish.first.first << " "
  // 	 << fish.first.second<< " : "
  // 	 << fish.second << endl;
  // }

  set<pair<ll, ll>> checked;

  ll ret = 1;
  ll zerozero = 0;
  for (auto fish : fish_set) {
    if (checked.count(fish.first))
      continue;
    auto anti = get_anti(fish.first);
    checked.insert(anti);

    if (fish.first.first == 0 && fish.first.second == 0) {
      zerozero += fish.second;
      continue;
    }

    ll subret = modpow(2, fish.second);
    if (fish_set.count(anti)) {
      subret += modpow(2, fish_set[anti]) - 1;
      while (subret < 0)
        subret += MOD;
      subret %= MOD;
    }
    ret *= subret;
    ret %= MOD;
  }
  ret = ret - 1 + zerozero;
  while (ret < 0)
    ret += MOD;
  ret %= MOD;

  cout << ret << endl;

  return 0;
}


Error: 0

Fixed submission:

#include <algorithm>     //sort,二分探索,など
#include <bitset>        //固定長bit集合
#include <cmath>         //pow,logなど
#include <complex>       //複素数
#include <deque>         //両端アクセスのキュー
#include <functional>    //sortのgreater
#include <iomanip>       //setprecision(浮動小数点の出力の誤差)
#include <iostream>      //入出力
#include <iterator>      //集合演算(積集合,和集合,差集合など)
#include <map>           //map(辞書)
#include <numeric>       //iota(整数列の生成),gcdとlcm(c++17)
#include <queue>         //キュー
#include <set>           //集合
#include <stack>         //スタック
#include <string>        //文字列
#include <unordered_map> //イテレータあるけど順序保持しないmap
#include <unordered_set> //イテレータあるけど順序保持しないset
#include <utility>       //pair
#include <vector>        //可変長配列

using namespace std;
typedef long long ll;

// マクロ
// forループ関係
// 引数は、(ループ内変数,動く範囲)か(ループ内変数,始めの数,終わりの数)、のどちらか
// Dがついてないものはループ変数は1ずつインクリメントされ、Dがついてるものはループ変数は1ずつデクリメントされる
#define REP(i, n) for (ll i = 0; i < (ll)(n); i++)
#define REPD(i, n) for (ll i = n - 1; i >= 0; i--)
#define FOR(i, a, b) for (ll i = a; i <= (ll)(b); i++)
#define FORD(i, a, b) for (ll i = a; i >= (ll)(b); i--)
// xにはvectorなどのコンテナ
#define ALL(x) (x).begin(), (x).end() // sortなどの引数を省略したい
#define SIZE(x) ((ll)(x).size())      // sizeをsize_tからllに直しておく
#define MAX(x) *max_element(ALL(x))   // 最大値を求める
#define MIN(x) *min_element(ALL(x))   // 最小値を求める
// 定数
#define INF 9000000000000000000 // 9e18:極めて大きい値
#define MOD 1000000007          // 10^9+7:合同式の法
#define MAXR 100000 // 10^5:配列の最大のrange(素数列挙などで使用)
#define LOGMAXR 18  // floor(log2(10^5)) + 1: 配列の最大のrangeのlog
// 略記
// #define PB push_back //vectorヘの挿入
// #define MP make_pair //pairのコンストラクタ
// #define F first //pairの一つ目の要素
// #define S second //pairの二つ目の要素

ll gcd(ll a, ll b) {
  if (a < 0)
    return gcd(-a, b);
  if (b < 0)
    return gcd(a, -b);
  if (b < a)
    return gcd(b, a);
  if (a == 0)
    return b;
  return gcd(b % a, a);
}

// n ^ p
ll modpow(ll n, ll p) {
  ll ret = 1;
  while (p) {
    if (p & 1) {
      ret *= n;
      ret %= MOD;
    }
    p >>= 1;
    n = n * n;
    n %= MOD;
  }
  return ret;
}

pair<ll, ll> get_pair(ll a, ll b) {
  ll g = gcd(a, b);
  a /= g;
  b /= g;
  if (a < 0) {
    a *= -1;
    b *= -1;
  }
  return make_pair(a, b);
}

pair<ll, ll> get_anti(pair<ll, ll> p) {
  ll b = -p.first;
  ll a = p.second;
  if (a < 0) {
    a *= -1;
    b *= -1;
  }
  return make_pair(a, b);
}

int main() {
  ll N;
  cin >> N;
  ll A[N], B[N];
  REP(n, N) {
    cin >> A[n] >> B[n];
    A[n] %= MOD;
    B[n] %= MOD;
  }

  map<pair<ll, ll>, ll> fish_set;

  REP(n, N) {
    auto p = get_pair(A[n], B[n]);
    if (fish_set.count(p)) {
      fish_set[p] += 1;
    } else {
      fish_set[p] = 1;
    }
  }

  // for(auto fish : fish_set){
  //   cout << fish.first.first << " "
  // 	 << fish.first.second<< " : "
  // 	 << fish.second << endl;
  // }

  set<pair<ll, ll>> checked;

  ll ret = 1;
  ll zerozero = 0;
  for (auto fish : fish_set) {
    if (checked.count(fish.first))
      continue;
    auto anti = get_anti(fish.first);
    checked.insert(anti);

    if (fish.first.first == 0 && fish.first.second == 0) {
      zerozero = 1;
      continue;
    }

    ll subret = modpow(2, fish.second);
    if (fish_set.count(anti)) {
      subret += modpow(2, fish_set[anti]) - 1;
      subret %= MOD;
    }
    ret *= subret;
    ret %= MOD;
  }
  ret = ret - 1 + zerozero;

  cout << ret << endl;

  return 0;
}