Problem p02679 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>
#define rep(i, b) for (int i = 1; i <= b; i++)
#define drep(i, b) for (int i = b; i >= 1; i--)
#define Rep(i, a, b) for (int i = a; i <= b; i++)
#define pr pair<int, int>
#define ff first
#define ss second
#define int long long
#define endl '\\n'
using namespace std;
const int N = 2e5 + 5;
const int mod = 1e9 + 7;
int n, m, k, t, x, y, z;

#define prr pair<pr, int>

int poww(int x, int k) {
  if (k == 0)
    return 1;
  int t = poww(x, k / 2);
  if (k & 1)
    return t * t % mod * x % mod;
  else
    return t * t % mod;
}

void solve(int ans = 1) {
  cin >> n;
  map<pr, int> mp;
  vector<pr> b;
  int _ans = 0;
  rep(i, n) {
    cin >> x >> y;
    int t = __gcd(x, y);
    if (t)
      x /= t, y /= t;
    if (x == 0 && y)
      y = 1;
    if (x && y == 0)
      x = 1;
    if (x < 0)
      x *= -1, y *= -1;
    mp[pr(x, y)]++;
  }
  for (prr p : mp)
    if (p.ss) {
      int x = p.ff.ff, y = p.ff.ss;
      if (x == 0 && y == 0)
        continue;
      else if (x == 0) {
        x = 1, y = 0;
      } else if (y == 0) {
        x = 0, y = 1;
      } else
        swap(x, y), x = -x;
      if (x < 0)
        y *= -1, x *= -1;
      int &t = mp[pr(x, y)], t2 = p.ss;
      // cout<<x<<' '<<y<<' '<<t<<endl;
      if (t)
        b.push_back(pr(t, t2));
      else
        ans = (ans * poww(2, t2)) % mod;
      t = 0;
    }
  rep(i, b.size()) {
    int x = b[i - 1].ff, y = b[i - 1].ss;
    ans = ans * ((poww(2, x) % mod + poww(2, y) % mod - 1 + mod) % mod) % mod;
  }
  cout << (ans + mp[pr(0, 0)] - 1 + mod) % mod << endl;
}

#undef int
int main() {
  ios::sync_with_stdio(false);
  // int T;cin>>T;
  // while(T--)
  solve();
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define rep(i, b) for (int i = 1; i <= b; i++)
#define drep(i, b) for (int i = b; i >= 1; i--)
#define Rep(i, a, b) for (int i = a; i <= b; i++)
#define pr pair<int, int>
#define ff first
#define ss second
#define int long long
#define endl '\\n'
using namespace std;
const int N = 2e5 + 5;
const int mod = 1e9 + 7;
int n, m, k, t, x, y, z;

#define prr pair<pr, int>

int poww(int x, int k) {
  if (k == 0)
    return 1;
  int t = poww(x, k / 2);
  if (k & 1)
    return t * t % mod * x % mod;
  else
    return t * t % mod;
}

void solve(int ans = 1) {
  cin >> n;
  map<pr, int> mp;
  vector<pr> b;
  int _ans = 0;
  rep(i, n) {
    cin >> x >> y;
    int t = __gcd(x, y);
    if (t)
      x /= t, y /= t;
    if (x < 0)
      x *= -1, y *= -1;
    mp[pr(x, y)]++;
  }
  for (prr p : mp)
    if (p.ss) {
      y = -p.ff.ff, x = p.ff.ss;
      if (x == 0 && y == 0) {
        while (1)
          cout << 1;
        _ans = poww(2, p.ss) - 1;
        continue;
      }
      if (x < 0)
        y *= -1, x *= -1;
      int &t = mp[pr(x, y)], t2 = p.ss;
      // cout<<x<<' '<<y<<' '<<t<<endl;
      if (t)
        b.push_back(pr(t, t2));
      else
        ans = (ans * poww(2, t2)) % mod;
      t = 0;
    }
  rep(i, b.size()) {
    int x = b[i - 1].ff, y = b[i - 1].ss;
    ans = ans * ((poww(2, x) % mod + poww(2, y) % mod - 1 + mod) % mod) % mod;
  }
  cout << (ans + _ans - 1 + mod) % mod << endl;
}

#undef int
int main() {
  ios::sync_with_stdio(false);
  // int T;cin>>T;
  // while(T--)
  solve();
}