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

#include <bits/stdc++.h>
using namespace std;

long long mod = 1000000007;

long long gcd(long long A, long long B) {
  A = abs(A);
  B = abs(B);

  if (A > B) {
    swap(A, B);
  }
  if (B % A == 0) {
    return A;
  }

  return gcd(A, B % A);
}

int main() {

  vector<long long> n2(210000);
  n2[0] = 1;

  for (int i = 1; i < 205000; i++) {
    n2[i] = n2[i - 1] * 2;
    n2[i] %= mod;
  }

  long long N, FF;
  cin >> N;

  vector<long long> A(N), B(N);

  long long allzero = 0;
  long long rzero = 0;
  long long lzero = 0;
  long long mi = 0;
  long long pl = 0;
  long long ans = 1;

  for (int i = 0; i < N; i++) {
    cin >> A[i] >> B[i];
    if (A[i] == 0 && B[i] == 0) {
      allzero++;
      continue;
    }
    if (A[i] == 0) {
      lzero++;
      continue;
    }
    if (B[i] == 0) {
      rzero++;
      continue;
    }
    FF = gcd(A[i], B[i]);
    if (A[i] < 0) {
      FF *= -1;
    }
    A[i] /= FF;
    B[i] /= FF;
    if (B[i] < 0) {
      mi++;
    } else {
      pl++;
    }
  }

  vector<vector<long long>> AB(N, vector<long long>(2, 0));

  for (int i = 0; i < N; i++) {
    AB[i][0] = A[i];
    AB[i][1] = B[i];
    if (AB[i][1] < 0) {
      AB[i][2] = 99;
      swap(AB[i][0], AB[i][1]);
      AB[i][0] *= -1;
    }
  }
  sort(AB.begin(), AB.end());

  vector<vector<long long>> daa(pl + mi, vector<long long>(4));
  long long aaaa = pl + mi;
  long long anow = 0;
  for (int i = 0; i < N; i++) {
    if (AB[i][0] == 0 || AB[i][1] == 0)
      continue;
    if (AB[i][2] == 99) {
      if (anow != 0) {
        if (AB[i][0] == daa[anow - 1][0] && AB[i][1] == daa[anow - 1][1]) {
          daa[anow - 1][3]++;
          aaaa--;
          continue;
        }
      }
      daa[anow][0] = AB[i][0];
      daa[anow][1] = AB[i][1];
      daa[anow][3] = 1;
      anow++;
    } else {
      if (anow != 0) {
        if (AB[i][0] == daa[anow - 1][0] && AB[i][1] == daa[anow - 1][1]) {
          daa[anow - 1][2]++;
          aaaa--;
          continue;
        }
      }
      daa[anow][0] = AB[i][0];
      daa[anow][1] = AB[i][1];
      daa[anow][2] = 1;
      anow++;
    }
  }

  long long bai;

  bai = n2[lzero] + n2[rzero] - 1;
  bai %= mod;

  ans *= bai;
  ans %= mod;

  for (int i = 0; i < aaaa; i++) {
    bai = n2[daa[i][2]];
    bai += n2[daa[i][3]];
    bai--;
    bai %= mod;

    ans *= bai;
    ans %= mod;
  }

  ans += allzero;
  ans %= mod;

  ans += mod;
  ans--;
  ans %= mod;

  cout << ans << endl;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;

long long mod = 1000000007;

long long pow_kai(long long a, long long n) {
  long long x = 1;
  while (n > 0) {
    if (n & 1) {
      x = x * a;
      x %= mod;
    }
    a = a * a;
    a %= mod;
    n >>= 1;
  }
  return x;
}

long long gcd(long long A, long long B) {
  A = abs(A);
  B = abs(B);

  if (A > B) {
    swap(A, B);
  }
  if (B % A == 0) {
    return A;
  }

  return gcd(A, B % A);
}

int main() {

  long long N, FF;
  cin >> N;

  vector<long long> A(N), B(N);

  long long allzero = 0;
  long long rzero = 0;
  long long lzero = 0;
  long long mi = 0;
  long long pl = 0;
  long long ans = 1;

  for (int i = 0; i < N; i++) {
    cin >> A[i] >> B[i];
    if (A[i] == 0 && B[i] == 0) {
      allzero++;
      continue;
    }
    if (A[i] == 0) {
      lzero++;
      continue;
    }
    if (B[i] == 0) {
      rzero++;
      continue;
    }
    FF = gcd(A[i], B[i]);
    if (A[i] < 0) {
      FF *= -1;
    }
    A[i] /= FF;
    B[i] /= FF;
    if (B[i] < 0) {
      mi++;
    } else {
      pl++;
    }
  }

  vector<vector<long long>> AB(N, vector<long long>(2, 0));

  for (int i = 0; i < N; i++) {
    AB[i][0] = A[i];
    AB[i][1] = B[i];
    if (AB[i][1] < 0) {
      AB[i][2] = 99;
      swap(AB[i][0], AB[i][1]);
      AB[i][0] *= -1;
    }
  }
  sort(AB.begin(), AB.end());

  vector<vector<long long>> daa(pl + mi, vector<long long>(4));
  long long aaaa = pl + mi;
  long long anow = 0;
  for (int i = 0; i < N; i++) {
    if (AB[i][0] == 0 || AB[i][1] == 0)
      continue;
    if (AB[i][2] == 99) {
      if (anow != 0) {
        if (AB[i][0] == daa[anow - 1][0] && AB[i][1] == daa[anow - 1][1]) {
          daa[anow - 1][3]++;
          aaaa--;
          continue;
        }
      }
      daa[anow][0] = AB[i][0];
      daa[anow][1] = AB[i][1];
      daa[anow][3] = 1;
      anow++;
    } else {
      if (anow != 0) {
        if (AB[i][0] == daa[anow - 1][0] && AB[i][1] == daa[anow - 1][1]) {
          daa[anow - 1][2]++;
          aaaa--;
          continue;
        }
      }
      daa[anow][0] = AB[i][0];
      daa[anow][1] = AB[i][1];
      daa[anow][2] = 1;
      anow++;
    }
  }

  for (int i = 0; i < aaaa; i++) {
    for (int j = 0; j < 4; j++) {
      cerr << daa[i][j] << " ";
    }

    cerr << endl;
  }

  long long bai;

  bai = pow_kai(2, lzero);
  bai += pow_kai(2, rzero);
  bai--;
  bai %= mod;

  ans *= bai;
  ans %= mod;

  cerr << ans << endl;

  for (int i = 0; i < aaaa; i++) {
    bai = pow_kai(2, daa[i][2]);
    bai += pow_kai(2, daa[i][3]);
    bai--;
    bai %= mod;

    ans *= bai;
    ans %= mod;
  }

  ans += allzero;
  ans %= mod;

  ans += mod;
  ans--;
  ans %= mod;

  cout << ans << endl;
}