func_code_string: #include <bits/stdc++.h>   namespace IO {   template <typename Tp>   inline Tp input() {     Tp x = 0, y = 1;     char c = getchar();     while ((c <  0  ||  9  < c) && c != EOF) {       if (c ==  - ) y = -1;       c = getchar();     }     if (c == EOF) return 0;     while ( 0  <= c && c <=  9 ) x = x * 10 + c -  0 , c = getchar();     return x *= y;   }   template <typename Tp>   inline void read(Tp &x) {     x = input<Tp>();   }   };  // namespace IO   using namespace IO;   namespace modular {   const int MOD = 1000000007;   inline int add(int x, int y) { return (x += y) >= MOD ? x -= MOD : x; }   inline void inc(int &x, int y) { (x += y) >= MOD ? x -= MOD : 0; }   inline int mul(int x, int y) { return 1LL * x * y % MOD; }   inline int qpow(int x, int y) {     int ans = 1;     for (; y; y >>= 1, x = mul(x, x))       if (y & 1) ans = mul(ans, x);     return ans;   }   };  // namespace modular   int N, top, tot;   int a[2007], b[2007], c[3];   std::pair<int, int> ans[2007 * 2007];   bool cmp(int x, int y) { return a[x] < a[y]; }   int main() {     srand(0x66ccf);     read(N);     for (int i = 1; i <= N; ++i) read(a[i]);     top = N;     for (int i = 1; i <= top; ++i) b[i] = i;     std::sort(b + 1, b + N + 1, cmp);     std::reverse(b + 1, b + N + 1);     while (top && !a[b[top]]) top--;     if (top < 2) return puts( -1 ), 0;     while (top > 2) {       for (int i = 0; i <= 2; ++i) {         c[i] = rand() % (top - i) + i + 1;         std::swap(b[i + 1], b[c[i]]);         c[i] = b[i + 1];       }       std::sort(c, c + 3, cmp);       int k = a[c[1]] / a[c[0]], mx = 0;       for (int i = 0; i <= 21; ++i)         if (k >> i & 1) mx = i;       for (int i = 0; i <= 2; ++i) b[i + 1] = c[i];       for (int i = 0; i <= mx; ++i) {         if (k >> i & 1) {           ans[++tot] = std::pair<int, int>(c[0], c[1]);           a[c[1]] -= a[c[0]];           a[c[0]] *= 2;         } else {           ans[++tot] = std::pair<int, int>(c[0], c[2]);           a[c[2]] -= a[c[0]];           a[c[0]] *= 2;         }       }       if (!a[c[1]]) {         std::swap(b[top], b[2]);         top--;       }     }     printf( %d n , tot);     for (int i = 1; i <= tot; ++i) printf( %d %d n , ans[i].first, ans[i].second);     return 0;   }   