#include <bits/stdc++.h>
using namespace std;
bool cmp(pair<double, int> p, pair<double, int> p1) {
  return p.first < p1.first;
}
long long int power(long long int x, long long int y, long long int p) {
  long long int res = 1;
  x = x % p;
  while (y > 0) {
    if (y & 1) res = (res * x) % p;
    y = y >> 1;
    x = (x * x) % p;
  }
  return res;
}
class edge {
 public:
  int a, b;
};
struct subset {
  int parent;
  int rank;
};
int find(struct subset subsets[], int i) {
  if (subsets[i].parent != i)
    subsets[i].parent = find(subsets, subsets[i].parent);
  return subsets[i].parent;
}
void Union(struct subset subsets[], int x, int y) {
  int xroot = find(subsets, x);
  int yroot = find(subsets, y);
  if (subsets[xroot].rank < subsets[yroot].rank)
    subsets[xroot].parent = yroot;
  else if (subsets[xroot].rank > subsets[yroot].rank)
    subsets[yroot].parent = xroot;
  else {
    subsets[yroot].parent = xroot;
    subsets[xroot].rank++;
  }
}
void dfs(vector<int> edges[], int a, int b, int visit[],
         map<int, vector<int>> &mp) {
  visit[a] = 1;
  for (auto i : edges[a]) {
    if (visit[i] == 1) {
      continue;
    } else {
      mp[b].push_back(i);
      dfs(edges, i, b + 1, visit, mp);
    }
  }
}
void solve() {
  long long int n;
  cin >> n;
  vector<pair<long double, int>> v;
  for (int i = 1; i <= n; i++) {
    int a, b;
    cin >> a >> b;
    long double res = atan2(b, a);
    v.push_back({res, i});
  }
  sort(v.begin(), v.end());
  long double diff = 1e18;
  pair<int, int> p;
  for (int i = 0; i < v.size(); i++) {
    long double r = (v[(i + 1) % n].first - v[i].first);
    if (r < 0) {
      r += 2 * acos(-1);
    }
    if (r < diff) {
      diff = r;
      p.first = v[i].second;
      p.second = v[(i + 1) % n].second;
    }
  }
  cout << p.first << " " << p.second << "\n";
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int t = 1;
  for (int i = 0; i < t; i++) solve();
  return 0;
}
