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>
#pragma GCC optimize "-O3"
using namespace std;
const long long MOD = 1e9 + 7;
long long pw(long long a, long long b) {
  long long ans = 1;
  while (b) {
    while (!(b & 1)) b >>= 1, a = (a * a) % MOD;
    ans = (ans * a) % MOD, --b;
  }
  return ans;
}
const int MAXN = 10000;
int R;
long long p[4];
vector<pair<int, int>> vv;
map<pair<int, int>, int> mm;
vector<pair<int, int>> a[MAXN];
long long b[MAXN];
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, -1, 0, 1};
vector<pair<int, int>> tmp;
int main() {
  ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> R;
  long long sum = 0;
  for (int i = 0; i < 4; ++i) cin >> p[i], sum += p[i];
  sum = pw(sum, MOD - 2);
  for (int i = 0; i < 4; ++i) p[i] = (p[i] * sum) % MOD;
  for (int x = -R; x <= R; ++x)
    for (int y = -R; y <= R; ++y)
      if (x * x + y * y <= R * R) {
        vv.emplace_back(x, y);
      }
  sort(vv.begin(), vv.end(), [](pair<int, int> x, pair<int, int> y) -> bool {
    return abs(x.first) + abs(x.second) > abs(y.first) + abs(y.second);
  });
  for (int i = 0; i < vv.size(); ++i) mm[vv[i]] = i;
  for (int i = 0; i < vv.size(); ++i) {
    int x, y;
    tie(x, y) = vv[i];
    a[i].emplace_back(i, 1);
    b[i] = 1;
    for (int j = 0; j < 4; ++j) {
      int nx = x + dx[j];
      int ny = y + dy[j];
      if (mm.count({nx, ny})) {
        a[i].emplace_back(mm[{nx, ny}], (MOD - p[j]) % MOD);
      }
    }
    sort(a[i].begin(), a[i].end());
  }
  int now = 0;
  for (int i = 0; i < vv.size(); ++i) {
    int fl = 0;
    for (int j = now; j < vv.size(); ++j) {
      if (!a[j].empty() && a[j][0].first == i) {
        fl = 1;
        swap(a[now], a[j]);
        swap(b[now], b[j]);
        break;
      }
    }
    assert(fl);
    long long go = pw(a[now][0].second, MOD - 2);
    for (int j = 0; j < a[now].size(); ++j)
      a[now][j].second = (a[now][j].second * go) % MOD;
    b[now] = b[now] * go % MOD;
    for (int j = now + 1; j < vv.size(); ++j) {
      if (a[j].empty() || a[j][0].first != i) continue;
      tmp.clear();
      long long mul = (MOD - a[j][0].second) % MOD;
      int cx = 0;
      int cy = 0;
      auto &x = a[now];
      auto &y = a[j];
      while (cx < x.size() || cy < y.size()) {
        if (cx < x.size() && cy < y.size()) {
          if (x[cx].first == y[cy].first) {
            int nw = (y[cy].second + mul * x[cx].second) % MOD;
            if (nw != 0) tmp.emplace_back(x[cx].first, nw);
            ++cx;
            ++cy;
          } else if (x[cx].first < y[cy].first) {
            tmp.emplace_back(x[cx].first, x[cx].second * mul % MOD);
            ++cx;
          } else {
            tmp.push_back(y[cy++]);
          }
        } else if (cx < x.size()) {
          tmp.emplace_back(x[cx].first, x[cx].second * mul % MOD);
          ++cx;
        } else {
          tmp.push_back(y[cy++]);
        }
      }
      a[j] = tmp;
      b[j] = (b[j] + b[now] * mul) % MOD;
    }
    ++now;
  }
  cout << b[vv.size() - 1] << "\n";
  return 0;
}