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;
char BB[1 << 15], *SS = BB, *TT = BB;
bool fl;
inline long long read() {
  long long x = 0;
  int f = 1;
  char ch = getchar();
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') f = -1;
  for (; isdigit(ch); ch = getchar()) x = x * 10 + (ch ^ 48);
  return x * f;
}
inline void print(long long x) {
  if (x < 0) {
    putchar('-');
    x = -x;
  }
  char ch = x % 10 + '0';
  if (x > 9) print(x / 10);
  putchar(ch);
}
const int N = 110, mod = 1000000007, O = 51, M = 8000;
long long qpow(long long a, long long b) {
  long long ans = 1;
  while (b) {
    if (b & 1) ans = ans * a % mod;
    a = a * a % mod;
    b >>= 1;
  }
  return ans % mod;
}
pair<int, int> pos[N * N];
struct i {
  int num;
  i(long long x = 0) { num = x; }
  friend i operator*(i a, i b) {
    a.num = (long long)a.num * (long long)b.num % mod;
    return a;
  }
  friend i operator+(i a, i b) {
    a.num = (a.num + b.num) % mod;
    return a;
  }
  friend i operator-(i b) {
    b.num = mod - b.num;
    return b;
  }
  friend i operator-(i a, i b) { return a + (-b); }
  friend i operator/(i a, i b) {
    a.num = (long long)a.num * qpow(b.num, mod - 2) % mod;
    return a;
  }
  friend i operator/(long long a, i b) {
    i k(a);
    return k / b;
  }
  friend void operator^(i &a, long long b) { a.num = b; }
  friend i operator++(i &a) {
    a.num++;
    return a;
  }
  friend long long operator+(i a, long long b) { return a.num + b; }
};
i r;
i dx[4] = {-1, 0, 1, 0}, dy[4] = {0, -1, 0, 1};
i p[4];
i id[N][N], tot;
i a[M][M], x, y, d;
signed main() {
  r.num = read();
  i all;
  all ^ 0;
  for (long long i = 0; i < 4; i++) p[i].num = read(), all = all + p[i];
  for (long long i = 0; i < 4; i++) p[i] = p[i] / all;
  for (long long y = -r.num; y <= r.num; y++)
    for (long long x = -r.num; x <= r.num; x++)
      if (x * x + y * y <= (r * r).num) {
        id[x + O][y + O] = (++tot);
        pos[tot.num] = make_pair(x + O, y + O);
      }
  for (long long i = 1; i <= tot.num; i++) {
    a[i][i] ^ 1, a[i][tot + 1] ^ 1;
    x ^ pos[i].first, y ^ pos[i].second;
    for (long long j = 0; j < 4; j++)
      if (id[(x + dx[j]).num][(y + dy[j]).num].num) {
        a[i][id[(x + dx[j]).num][(y + dy[j]).num].num] = (-p[j]);
      }
  }
  long long lim = 0;
  for (long long i = 1; i <= tot.num; i++) {
    lim = max(lim, (long long)id[pos[i].first][pos[i].second + 1].num);
    for (long long j = i + 1; j <= lim; j++)
      if (a[j][i].num) {
        d = (-a[j][i]) / a[i][i];
        for (long long k = i; k <= lim; k++) a[j][k] = a[j][k] + d * a[i][k];
        a[j][tot + 1] = a[j][tot + 1] + d * a[i][tot + 1];
      }
  }
  for (long long i = tot.num; i >= 1; i--) {
    for (long long j = i + 1; j <= tot.num; j++) {
      a[i][tot + 1] = a[i][tot + 1] - a[i][j] * a[j][tot + 1];
      a[i][j] ^ 0;
    }
    a[i][tot + 1] = a[i][tot + 1] / a[i][i];
    a[i][i] ^ 1;
  }
  print(a[id[O][O].num][tot + 1].num);
}