Problem: A chip was placed on a field with coordinate system onto point (0, 0).

Every second the chip moves randomly. If the chip is currently at a point (x, y), after a second it moves to the point (x - 1, y) with probability p1, to the point (x, y - 1) with probability p2, to the point (x + 1, y) with probability p3 and to the point (x, y + 1) with probability p4. It's guaranteed that p1 + p2 + p3 + p4 = 1. The moves are independent.

Find out the expected time after which chip will move away from origin at a distance greater than R (i.e. <image> will be satisfied).

Input

First line contains five integers R, a1, a2, a3 and a4 (0 ≤ R ≤ 50, 1 ≤ a1, a2, a3, a4 ≤ 1000).

Probabilities pi can be calculated using formula <image>.

Output

It can be shown that answer for this problem is always a rational number of form <image>, where <image>.

Print P·Q - 1 modulo 109 + 7. 

Examples

Input

0 1 1 1 1


Output

1

Input

1 1 1 1 1


Output

666666674

Input

1 1 2 1 2


Output

538461545

Note

In the first example initially the chip is located at a distance 0 from origin. In one second chip will move to distance 1 is some direction, so distance to origin will become 1.

Answers to the second and the third tests: <image> and <image>.

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
namespace Fread {
const int MAXN = 1 << 20;
char buffer[MAXN], *S, *T;
inline char getchar() {
  if (S == T) {
    T = (S = buffer) + fread(buffer, 1, MAXN, stdin);
    if (S == T) return EOF;
  }
  return *S++;
}
}  // namespace Fread
inline int read() {
  int f = 1, x = 0;
  char ch = Fread::getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    ch = Fread::getchar();
  }
  while (isdigit(ch)) {
    x = x * 10 + ch - '0';
    ch = Fread::getchar();
  }
  return x * f;
}
inline long long readll() {
  long long f = 1, x = 0;
  char ch = Fread::getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    ch = Fread::getchar();
  }
  while (isdigit(ch)) {
    x = x * 10 + ch - '0';
    ch = Fread::getchar();
  }
  return x * f;
}
const int MOD = 1e9 + 7;
inline int mod1(int x) { return x < MOD ? x : x - MOD; }
inline int mod2(int x) { return x < 0 ? x + MOD : x; }
inline int pow_mod(int x, int i) {
  int y = 1;
  while (i) {
    if (i & 1) y = (long long)y * x % MOD;
    x = (long long)x * x % MOD;
    i >>= 1;
  }
  return y;
}
int R, a1, a2, a3, a4, p1, p2, p3, p4, id[105][105], f[50 * 50 * 4][105], cnt,
    vis[105], g[105][105], val[105];
inline int t(int x) { return x + (R + 1); }
bool in_cir(int x, int y) { return x * x + y * y <= R * R; }
struct po {
  int x, y;
  po(int xx = 0, int yy = 0) { x = xx, y = yy; }
} p[50 * 50 * 4];
int main() {
  R = read();
  if (!R) return puts("1"), 0;
  a1 = read(), a2 = read(), a3 = read(), a4 = read();
  int tmp = pow_mod(a1 + a2 + a3 + a4, MOD - 2);
  p1 = (long long)a1 * tmp % MOD, p2 = (long long)a2 * tmp % MOD,
  p3 = (long long)a3 * tmp % MOD, p4 = (long long)a4 * tmp % MOD;
  for (int i = -R; i <= R; ++i) {
    for (int j = -R; j <= R; ++j) {
      if (in_cir(i, j)) p[++cnt] = po(i, j), id[t(i)][t(j)] = cnt;
    }
  }
  int ct = 0;
  for (int i = 1; i <= cnt; ++i)
    if (!vis[t(p[i].y)]) {
      vis[t(p[i].y)] = 1;
      ++ct;
      f[i][ct] = 1;
    }
  int ip3 = pow_mod(p3, MOD - 2);
  for (int i = 1; i <= cnt; ++i) {
    int j = i;
    while (j + 1 <= cnt && p[j + 1].x == p[i].x) ++j;
    for (int k = i; k <= j; ++k) {
      int r = id[t(p[k].x + 1)][t(p[k].y)], l = id[t(p[k].x - 1)][t(p[k].y)],
          u = id[t(p[k].x)][t(p[k].y + 1)], d = id[t(p[k].x)][t(p[k].y - 1)];
      if (!r) continue;
      for (int x = 1; x <= R * 2 + 2; ++x) {
        f[r][x] = (long long)ip3 * f[k][x] % MOD;
        if (l)
          f[r][x] = mod2(f[r][x] - (long long)p1 * f[l][x] % MOD * ip3 % MOD);
        if (u)
          f[r][x] = mod2(f[r][x] - (long long)p4 * f[u][x] % MOD * ip3 % MOD);
        if (d)
          f[r][x] = mod2(f[r][x] - (long long)p2 * f[d][x] % MOD * ip3 % MOD);
      }
      f[r][R * 2 + 2] = mod2(f[r][R * 2 + 2] - ip3);
    }
    i = j;
  }
  memset(vis, 0, sizeof(vis));
  int n = 0;
  for (int i = cnt; i >= 1; --i) {
    if (vis[t(p[i].y)]) continue;
    vis[t(p[i].y)] = 1;
    ++n;
    int r = id[t(p[i].x + 1)][t(p[i].y)], l = id[t(p[i].x - 1)][t(p[i].y)],
        u = id[t(p[i].x)][t(p[i].y + 1)], d = id[t(p[i].x)][t(p[i].y - 1)];
    assert(!r);
    for (int j = 1; j <= 2 * R + 2; ++j) {
      g[n][j] = f[i][j];
      if (l) g[n][j] = mod2(g[n][j] - (long long)p1 * f[l][j] % MOD);
      if (u) g[n][j] = mod2(g[n][j] - (long long)p4 * f[u][j] % MOD);
      if (d) g[n][j] = mod2(g[n][j] - (long long)p2 * f[d][j] % MOD);
    }
    g[n][2 * R + 2] = mod1(mod2(-g[n][2 * R + 2]) + 1);
  }
  assert(n == 2 * R + 1);
  for (int i = 1; i <= n; ++i) {
    int r = -1;
    for (int j = i; j <= n; ++j)
      if (g[j][i] != 0) {
        r = j;
        break;
      }
    assert(r != -1);
    if (r != i)
      for (int j = 1; j <= n + 1; ++j) swap(g[i][j], g[r][j]);
    for (int j = 1; j <= n; ++j)
      if (j != i) {
        int t = (long long)g[j][i] * pow_mod(g[i][i], MOD - 2) % MOD;
        for (int k = 1; k <= n + 1; ++k) {
          g[j][k] = mod2(g[j][k] - (long long)t * g[i][k] % MOD) % MOD;
        }
      }
  }
  for (int i = 1; i <= n; ++i)
    val[i] = (long long)g[i][n + 1] * pow_mod(g[i][i], MOD - 2) % MOD;
  val[R * 2 + 2] = 1;
  for (int i = 1; i <= cnt; ++i)
    if (p[i].x == 0 && p[i].y == 0) {
      int ans = 0;
      for (int j = 1; j <= R * 2 + 2; ++j) {
        ans = mod1(ans + (long long)f[i][j] * val[j] % MOD);
      }
      cout << ans << endl;
      return 0;
    }
  assert(0);
  return 0;
}