#include using namespace std; uint64_t seed = 1234567891234567891; uint64_t xorshift64() { seed ^= seed << 13; seed ^= seed >> 7; seed ^= seed << 17; return seed; } int rand_int(int l, int r) { return l + xorshift64() % (r - l); } int main() { // step #1. input int N; cin >> N; vector A(N), B(N); for (int i = 0; i < N; i++) { cin >> A[i] >> B[i]; } // step #2. brute force const int samples = 1000000; vector used(45, false); for (int i = 0; i < 32; i++) { used[i] = true; } double bestdiff = 1.0e+99; vector best; for (int id = 1; id <= samples; id++) { for (int i = 2; i < N; i++) { swap(used[i], used[rand_int(1, i + 1)]); } double sa = 0.0, sb = 0.0; for (int i = 0; i < N; i++) { if (used[i]) { sa += A[i]; sb += B[i]; } } sa /= 32.0; sb /= 32.0; double diff = max(abs(sa - 5.0e+17), abs(sb - 5.0e+17)); if (bestdiff > diff) { bestdiff = diff; best = used; } } // step #3. final calculation vector v; for (int i = 0; i < N; i++) { if (best[i]) { v.push_back(i); } } // step #4. output cout << 31 << endl; for (int i = 2; i <= 32; i *= 2) { for (int j = 0; j < 32; j += i) { cout << v[j] + 1 << ' ' << v[j + i / 2] + 1 << endl; } } cerr << "bestdiff = " << bestdiff << endl; return 0; }