#include <bits/stdc++.h>
using namespace std;
template <class T1, class T2>
inline void gmax(T1 &a, T2 b) {
  if (b > a) a = b;
}
template <class T1, class T2>
inline void gmin(T1 &a, T2 b) {
  if (b < a) a = b;
}
const int N = 1e5 + 10;
const long long INF = 1e18;
int casenum, casei;
const long long Z = 1e9 + 7;
struct matrix {
  long long v[2][2];
  void O() { memset(v, 0, sizeof(v)); };
  void E() {
    memset(v, 0, sizeof(v));
    for (int i = 0; i < 2; i++) v[i][i] = 1;
  }
  matrix operator*(const matrix &b) {
    matrix c;
    c.O();
    for (int k = 0; k < 2; k++) {
      for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2; j++) {
          c.v[i][j] = (c.v[i][j] + v[i][k] * b.v[k][j] % Z) % Z;
        }
      }
    }
    return c;
  }
  matrix operator^(long long p) {
    matrix x, y;
    x.E();
    memcpy(y.v, v, sizeof(y.v));
    while (p) {
      if (p & 1) x = x * y;
      p >>= 1;
      y = y * y;
    }
    return x;
  }
} a, b;
long long mul(long long x, long long y) {
  long long ans = 1;
  while (y) {
    if (y & 1) ans = ans * x % Z;
    y >>= 1;
    x = x * x % Z;
  }
  return ans;
}
long long c[N];
int n;
int main() {
  while (~scanf("%d", &n)) {
    memset(a.v, 0, sizeof(a.v)), memset(b.v, 0, sizeof(b.v));
    a.v[0][0] = -1;
    a.v[0][1] = 1;
    a.v[1][1] = 2;
    b.v[0][0] = 1;
    b.v[1][0] = 1;
    long long P = 1;
    for (int i = 1; i <= n; i++) {
      scanf("%lld", &c[i]);
      P = c[i] % (Z - 1) * P % (Z - 1);
    }
    a = a ^ P;
    b = a * b;
    P = mul(2, Z - 2);
    b.v[0][0] = b.v[0][0] * P % Z;
    b.v[1][0] = b.v[1][0] * P % Z;
    while (b.v[0][0] < 0) b.v[0][0] += Z;
    while (b.v[1][0] < 0) b.v[1][0] += Z;
    printf("%lld/%lld\n", b.v[0][0], b.v[1][0]);
  }
  return 0;
}
