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>.
#include <bits/stdc++.h>
using namespace std;
const int maxr = 50, maxn = 7845, MOD = 1e9 + 7,
          df[4][2] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};
int R, p[4], n, tem[(maxr << 1) + 5][(maxr << 1) + 5], M[maxn + 5][maxn + 5],
    ans[maxn + 5];
inline int Pow(int w, int b) {
  int s = 1;
  for (; b; b >>= 1, w = (long long)w * w % MOD)
    if (b & 1) s = (long long)s * w % MOD;
  return s;
}
inline void AMOD(int &x, int tem) {
  if ((x += tem) >= MOD) x -= MOD;
}
inline int Solve() {
  for (int i = 1; i <= n; i++)
    for (int j = i + 1, d = 1; j <= n && d <= (R << 1); j++, d++) {
      int now = MOD - (long long)M[j][i] * Pow(M[i][i], MOD - 2) % MOD;
      for (int k = i, d = 0; k <= n && d <= (R << 1); k++, d++)
        AMOD(M[j][k], (long long)M[i][k] * now % MOD);
      AMOD(M[j][0], (long long)M[i][0] * now % MOD);
    }
  for (int i = (ans[0] = 1, n); i; i--) {
    ans[i] = (long long)M[i][0] * ans[0] % MOD;
    for (int j = i + 1; j <= n; j++)
      AMOD(ans[i], MOD - (long long)M[i][j] * ans[j] % MOD);
    ans[i] = (long long)ans[i] * Pow(M[i][i], MOD - 2) % MOD;
  }
  return ans[(tem[(0) + maxr + 1][(0) + maxr + 1])];
}
int main() {
  scanf("%d%d%d%d%d", &R, &p[0], &p[1], &p[2], &p[3]);
  int P = p[0] + p[1] + p[2] + p[3];
  for (int i = 0; i < 4; i++) p[i] = (long long)p[i] * Pow(P, MOD - 2) % MOD;
  for (int x = -R; x <= R; x++)
    for (int y = -R; y <= R; y++)
      if (x * x + y * y <= R * R) (tem[(x) + maxr + 1][(y) + maxr + 1]) = ++n;
  for (int x = -R; x <= R; x++)
    for (int y = -R; y <= R; y++) {
      if (!(tem[(x) + maxr + 1][(y) + maxr + 1])) continue;
      M[(tem[(x) + maxr + 1][(y) + maxr + 1])]
       [(tem[(x) + maxr + 1][(y) + maxr + 1])] =
           M[(tem[(x) + maxr + 1][(y) + maxr + 1])][0] = MOD - 1;
      int xx, yy;
      for (int f = 0; f < 4; f++)
        if ((tem[(xx = x + df[f][0]) + maxr + 1]
                [(yy = y + df[f][1]) + maxr + 1]))
          M[(tem[(x) + maxr + 1][(y) + maxr + 1])]
           [(tem[(xx) + maxr + 1][(yy) + maxr + 1])] = p[f];
    }
  return printf("%d\n", Solve()), 0;
}
