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

#include <bits/stdc++.h>
using namespace std;
typedef long long lli;
typedef long double lld;
#define mod 1000000007
#define mod2 998244353
#define fori(n) for (int i = 0; i < n; i++)
#define forj(n) for (int j = 0; j < n; j++)
#define pb push_back
#define mp make_pair
#define F first
#define S second
#define fast ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define endl "\\n"
#define sortvec(a) sort(a.begin(), a.end())
#define watch(x) cerr << "\\n" << (#x) << " is " << (x) << endl
#define cerr                                                                   \\
  if (true)                                                                    \\
  cerr

template <typename T, typename U>
ostream &operator<<(ostream &out, const pair<T, U> &p) {
  out << "(" << p.first << ", " << p.second << ")";
  return out;
}
template <template <typename, typename...> class ContainerType,
          typename ValueType, typename... Args>
void print(const ContainerType<ValueType, Args...> &c) {
  for (const auto &v : c)
    cout << v << ' ';
  cout << '\\n';
}

void print() { cout << '\\n'; }
template <typename T, typename... Args> void print(T a, Args... args) {
  cout << a << " ";
  print(args...);
}

lli llipower(lli x, lli y, lli p = LLONG_MAX) {
  lli res = 1;
  x = x % p;
  while (y > 0) {
    if (y & 1)
      res = (res * x) % p;
    y = y >> 1;
    x = (x * x) % p;
  }
  return res;
}
lli binarySearch(vector<int> arr, int l, int r, int x) {
  if (r >= l) {
    lli mid = l + (r - l) / 2;
    if (arr[mid] == x)
      return mid;
    if (arr[mid] > x)
      return binarySearch(arr, l, mid - 1, x);
    return binarySearch(arr, mid + 1, r, x);
  }
  return -1;
}

//---------------------------------------------------------------------------------

int main() {
  // int t,tt;
  // cin >> t;
  // tt=t;
  // while (t--)
  // {
  //     int n;
  //     cin>>n;
  //     vector<int> a(n);
  //     fori(n) cin>>a[i];
  //     vector<int> pref(n+1,0);
  //     int sumv=0;
  //     fori(n){
  //         sumv+=a[i];
  //         pref[i+1]=sumv;
  //     }
  //     vector<int> sqs;
  //     fori(10000){
  //         if(i*i<=10000099) sqs.pb(i*i);
  //     }
  //     int curr;
  //     int ans=0;
  //     for(int i=1;i<=n;i++){
  //         curr=pref[i];
  //         for(auto j:sqs){
  //             if(binarySearch(pref,0,n,pref[i]-j)!=-1 &&){
  //                 ans++;
  //                 cout<<i<<" "<<j<<endl;
  //             }
  //         }
  //     }

  //     cout<<"Case #"<<tt-t<<": "<<ans<<endl;
  // }
  lli n;
  lli x, y, g;

  cin >> n;
  vector<pair<lli, lli>> p(n);
  map<pair<lli, lli>, lli> mps;
  // cout<<__gcd((lli)-1e18,(lli)1e18);
  lli c = 0;
  fori(n) {
    cin >> x >> y;
    if (x == 0 && y == 0) {
      c++;
      continue;
    }
    if ((y < 0)) {
      x *= -1;
      y *= -1;
    }
    g = __gcd(x, y);
    x /= g;
    y /= g;
    // cout<<x<<" "<<y<<endl;
    p[i] = (mp(x, y));
    mps[p[i]]++;
  }

  lli ans = 1;

  fori(n) {
    x = 0;
    if (mps.count(p[i]))
      x = mps[p[i]];
    y = 0;
    if (mps.count(mp(-1 * p[i].S, p[i].F)))
      y += mps[mp(-1 * p[i].S, p[i].F)];
    if (mps.count(mp(p[i].S, -1 * p[i].F)))
      y += mps[mp(p[i].S, -1 * p[i].F)];

    // print(p[i],x,y,ans);

    ans = ans * ((llipower(2, x, mod) + llipower(2, y, mod) + mod - 1) % mod);
    ans %= mod;

    if (mps.count(p[i]))
      mps[p[i]] = 0LL;
    if (mps.count(mp(-1 * p[i].S, p[i].F)))
      mps[mp(-1 * p[i].S, p[i].F)] = 0LL;
    if (mps.count(mp(p[i].S, -1 * p[i].F)))
      mps[mp(p[i].S, -1 * p[i].F)] = 0LL;
  }
  cout << (ans + mod - 1 + c) % mod << endl;
}

Error: 0

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
typedef long long lli;
typedef long double lld;
#define mod 1000000007
#define mod2 998244353
#define fori(n) for (int i = 0; i < n; i++)
#define forj(n) for (int j = 0; j < n; j++)
#define pb push_back
#define mp make_pair
#define F first
#define S second
#define fast ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define endl "\\n"
#define sortvec(a) sort(a.begin(), a.end())
#define watch(x) cerr << "\\n" << (#x) << " is " << (x) << endl
#define cerr                                                                   \\
  if (true)                                                                    \\
  cerr

template <typename T, typename U>
ostream &operator<<(ostream &out, const pair<T, U> &p) {
  out << "(" << p.first << ", " << p.second << ")";
  return out;
}
template <template <typename, typename...> class ContainerType,
          typename ValueType, typename... Args>
void print(const ContainerType<ValueType, Args...> &c) {
  for (const auto &v : c)
    cout << v << ' ';
  cout << '\\n';
}

void print() { cout << '\\n'; }
template <typename T, typename... Args> void print(T a, Args... args) {
  cout << a << " ";
  print(args...);
}

lli llipower(lli x, lli y, lli p = LLONG_MAX) {
  lli res = 1;
  x = x % p;
  while (y > 0) {
    if (y & 1)
      res = (res * x) % p;
    y = y >> 1;
    x = (x * x) % p;
  }
  return res;
}
lli binarySearch(vector<int> arr, int l, int r, int x) {
  if (r >= l) {
    lli mid = l + (r - l) / 2;
    if (arr[mid] == x)
      return mid;
    if (arr[mid] > x)
      return binarySearch(arr, l, mid - 1, x);
    return binarySearch(arr, mid + 1, r, x);
  }
  return -1;
}

//---------------------------------------------------------------------------------

int main() {
  // int t,tt;
  // cin >> t;
  // tt=t;
  // while (t--)
  // {
  //     int n;
  //     cin>>n;
  //     vector<int> a(n);
  //     fori(n) cin>>a[i];
  //     vector<int> pref(n+1,0);
  //     int sumv=0;
  //     fori(n){
  //         sumv+=a[i];
  //         pref[i+1]=sumv;
  //     }
  //     vector<int> sqs;
  //     fori(10000){
  //         if(i*i<=10000099) sqs.pb(i*i);
  //     }
  //     int curr;
  //     int ans=0;
  //     for(int i=1;i<=n;i++){
  //         curr=pref[i];
  //         for(auto j:sqs){
  //             if(binarySearch(pref,0,n,pref[i]-j)!=-1 &&){
  //                 ans++;
  //                 cout<<i<<" "<<j<<endl;
  //             }
  //         }
  //     }

  //     cout<<"Case #"<<tt-t<<": "<<ans<<endl;
  // }
  lli n;
  lli x, y, g;

  cin >> n;
  vector<pair<lli, lli>> p(n);
  map<pair<lli, lli>, lli> mps;
  fori(n) {
    cin >> x >> y;

    if ((y < 0)) {
      x *= -1;
      y *= -1;
    }
    g = __gcd(x, y);
    x /= g;
    y /= g;
    // cout<<x<<" "<<y<<endl;
    p[i] = (mp(x, y));
    mps[p[i]]++;
  }

  lli ans = 1;

  fori(n) {
    x = mps[p[i]];
    y = 0;
    if (mps.count(mp(-1 * p[i].S, p[i].F)))
      y += mps[mp(-1 * p[i].S, p[i].F)];
    if (mps.count(mp(p[i].S, -1 * p[i].F)))
      y += mps[mp(p[i].S, -1 * p[i].F)];

    // print(p[i],x,y,ans);

    ans = ans * ((llipower(2, x, mod) + llipower(2, y, mod) + mod - 1) % mod);
    ans %= mod;

    if (mps.count(p[i]))
      mps[p[i]] = 0LL;
    if (mps.count(mp(-1 * p[i].S, p[i].F)))
      mps[mp(-1 * p[i].S, p[i].F)] = 0LL;
    if (mps.count(mp(p[i].S, -1 * p[i].F)))
      mps[mp(p[i].S, -1 * p[i].F)] = 0LL;
  }
  cout << (ans + mod - 1) % mod << endl;
}