#include <bits/stdc++.h>
using namespace std;
const long long modl = 1000000007;
int n, h, w;
string pattern;
long long H[1000010], V[1000010];
long long R[1000010], C[1000010];
int check_row(int i) {
  int j = 0;
  int step = 0;
  while (i > 0 && i <= h) {
    if (pattern[j] == 'U') i--;
    if (pattern[j] == 'D') i++;
    j = (j + 1) % pattern.size();
    step++;
  }
  return step;
}
int main() {
  cin >> n >> h >> w;
  cin >> pattern;
  {
    memset(H, 63, sizeof H);
    H[0 + 500000] = 0;
    int last = 0, current = 0, low = 0, high = 0;
    for (int i = 0; i < pattern.size(); i++) {
      if (pattern[i] == 'L') current--;
      if (pattern[i] == 'R') current++;
      last = current;
      low = min(low, current);
      high = max(high, current);
      H[current + 500000] = min(H[current + 500000], i + 1ll);
    }
    if (abs(last) > 0) {
      for (int i = -500000; i <= 500000; i++) {
        int coef;
        if (last > 0) {
          coef = (i - high - 1) / last + 1;
          if (coef >= 0)
            H[i + 500000] =
                min(H[i + 500000], coef * (long long)pattern.size() +
                                       H[i - coef * last + 500000]);
        } else {
          coef = (-i + low - 1) / (-last) + 1;
          if (coef >= 0)
            H[i + 500000] =
                min(H[i + 500000], coef * (long long)pattern.size() +
                                       H[i - coef * last + 500000]);
        }
      }
    }
  }
  {
    memset(V, 63, sizeof V);
    V[0 + 500000] = 0;
    int last = 0, current = 0, low = 0, high = 0;
    for (int i = 0; i < pattern.size(); i++) {
      if (pattern[i] == 'U') current--;
      if (pattern[i] == 'D') current++;
      last = current;
      low = min(low, current);
      high = max(high, current);
      V[current + 500000] = min(V[current + 500000], i + 1ll);
    }
    if (abs(last) > 0) {
      for (int i = -500000; i <= 500000; i++) {
        int coef;
        if (last > 0) {
          coef = (i - high - 1) / last + 1;
          if (coef >= 0)
            V[i + 500000] =
                min(V[i + 500000], coef * (long long)pattern.size() +
                                       V[i - coef * last + 500000]);
        } else {
          coef = (-i + low - 1) / (-last) + 1;
          if (coef >= 0)
            V[i + 500000] =
                min(V[i + 500000], coef * (long long)pattern.size() +
                                       V[i - coef * last + 500000]);
        }
      }
    }
  }
  int inconsistent = 0;
  for (int i = 1; i <= h; i++) {
    R[i] = min(V[-i + 500000], V[h - i + 1 + 500000]);
    if (R[i] > 1e18) inconsistent |= 1;
  }
  for (int i = 1; i <= w; i++) {
    C[i] = min(H[-i + 500000], H[w - i + 1 + 500000]);
    if (C[i] > 1e18) inconsistent |= 2;
  }
  if (inconsistent == 3) {
    cout << -1;
    return 0;
  }
  long long answer = 0;
  vector<long long> ordered;
  ordered.clear();
  for (int i = 1; i <= h; i++) ordered.push_back(-R[i]);
  sort(ordered.begin(), ordered.end());
  for (int i = 1; i <= w; i++) {
    int counter =
        lower_bound(ordered.begin(), ordered.end(), -C[i]) - ordered.begin();
    answer = (answer + (C[i] % modl) * counter) % modl;
  }
  ordered.clear();
  for (int i = 1; i <= w; i++) ordered.push_back(-C[i]);
  sort(ordered.begin(), ordered.end());
  for (int i = 1; i <= h; i++) {
    int counter =
        upper_bound(ordered.begin(), ordered.end(), -R[i]) - ordered.begin();
    answer = (answer + (R[i] % modl) * counter) % modl;
  }
  cout << answer;
  return 0;
}
