#include <bits/stdc++.h>
using namespace std;
namespace input {
const int InputBufferSize = (1 << 24) + 5;
char buffer[InputBufferSize], *s, *eof;
inline void init() {
  assert(stdin != NULL);
  s = buffer;
  eof = s + fread(buffer, 1, InputBufferSize, stdin);
}
inline bool read(int& x) {
  x = 0;
  int flag = 1;
  while (!isdigit(*s) && *s != '-') s++;
  if (eof <= s) return false;
  if (*s == '-') flag = -1, s++;
  while (isdigit(*s)) x = x * 10 + *s++ - '0';
  x *= flag;
  return true;
}
inline bool read(char* str) {
  *str = 0;
  while (isspace(*s)) s++;
  if (eof < s) return false;
  while (!isspace(*s)) *str = 0, *str = *s, str++, s++;
  *str = 0;
  return true;
}
}  // namespace input
using namespace input;
int const p = 1e9 + 7;
int pr[305], cnt, a[400005], tmp[65], id[305], c[305], tree[1600005],
    tag[1600005];
long long b[400005], tree2[1600005], tag2[1600005];
bool flag[305];
long long res(int x) {
  memset(tmp, 0, sizeof(tmp));
  long long res = 0;
  for (int i = 0; i <= 6; i++)
    while (!(x % pr[i])) x /= pr[i], res |= (1ll << i);
  if (x != 1) res |= (1ll << id[x]);
  return res;
}
int pw(int x, int y) {
  int res = 1;
  while (y) {
    if (y & 1) res = 1ll * res * x % p;
    x = 1ll * x * x % p;
    y >>= 1;
  }
  return res;
}
void build(int l, int r, int x) {
  if (l == r) {
    tree[x] = a[l];
    tag[x] = 1;
    return;
  }
  int mid = (l + r) >> 1;
  build(l, mid, x * 2), build(mid + 1, r, x * 2 + 1);
  tree[x] = 1ll * tree[x * 2] * tree[x * 2 + 1] % p;
  tag[x] = 1;
}
void build2(int l, int r, int x) {
  if (l == r) {
    tree2[x] = b[l];
    return;
  }
  int mid = (l + r) >> 1;
  build2(l, mid, x * 2), build2(mid + 1, r, x * 2 + 1);
  tree2[x] = (tree2[x * 2] | tree2[x * 2 + 1]);
}
void pushdown(int l, int r, int x) {
  if (tag[x] == 1) return;
  tree[x] = 1ll * tree[x] * pw(tag[x], r - l + 1) % p;
  if (l != r)
    tag[x * 2] = 1ll * tag[x * 2] * tag[x] % p,
            tag[x * 2 + 1] = 1ll * tag[x * 2 + 1] * tag[x] % p;
  tag[x] = 1;
}
void modify(int l, int r, int x, int a, int b, int c) {
  if (l >= a && r <= b) {
    tag[x] = 1ll * tag[x] * c % p;
    return;
  }
  int mid = (l + r) >> 1;
  if (a <= mid) modify(l, mid, x * 2, a, b, c);
  if (b > mid) modify(mid + 1, r, x * 2 + 1, a, b, c);
  pushdown(l, mid, x * 2), pushdown(mid + 1, r, x * 2 + 1);
  tree[x] = 1ll * tree[x * 2] * tree[x * 2 + 1] % p;
}
void pushdown2(int l, int r, int x) {
  if (!tag2[x]) return;
  tree2[x] |= tag2[x];
  if (l != r) tag2[x * 2] |= tag2[x], tag2[x * 2 + 1] |= tag2[x];
  tag2[x] = 0;
}
void modify2(int l, int r, int x, int a, int b, long long c) {
  if (l >= a && r <= b) {
    tag2[x] = (tag2[x] | c);
    return;
  }
  int mid = (l + r) >> 1;
  if (a <= mid) modify2(l, mid, x * 2, a, b, c);
  if (b > mid) modify2(mid + 1, r, x * 2 + 1, a, b, c);
  pushdown2(l, mid, x * 2), pushdown2(mid + 1, r, x * 2 + 1);
  tree2[x] = (tree2[x * 2] | tree2[x * 2 + 1]);
}
int ask(int l, int r, int x, int a, int b) {
  pushdown(l, r, x);
  if (l >= a && r <= b) return tree[x];
  int mid = (l + r) >> 1, res = 1;
  if (a <= mid) res = ask(l, mid, x * 2, a, b);
  if (b > mid) res = 1ll * res * ask(mid + 1, r, x * 2 + 1, a, b) % p;
  return res;
}
long long ask2(int l, int r, int x, int a, int b) {
  pushdown2(l, r, x);
  if (l >= a && r <= b) return tree2[x];
  int mid = (l + r) >> 1;
  long long res = 0;
  if (a <= mid) res = ask2(l, mid, x * 2, a, b);
  if (b > mid) res = (res | ask2(mid + 1, r, x * 2 + 1, a, b));
  return res;
}
char op[15];
int main() {
  for (int i = 2; i <= 300; i++) {
    if (!flag[i])
      pr[cnt] = i, id[i] = cnt, c[cnt] = 1ll * (i - 1) * pw(i, p - 2) % p,
      cnt++;
    for (int j = i * 2; j <= 300; j += i) flag[j] = 1;
  }
  init();
  int n, q, l, r, x;
  long long y;
  read(n), read(q);
  for (int i = 1; i <= n; i++) {
    read(a[i]);
    b[i] = res(a[i]);
  }
  build(1, n, 1), build2(1, n, 1);
  while (q--) {
    read(op);
    if (op[0] == 'M') {
      read(l), read(r), read(x);
      y = res(x);
      modify(1, n, 1, l, r, x), modify2(1, n, 1, l, r, y);
    } else {
      read(l), read(r);
      x = ask(1, n, 1, l, r), y = ask2(1, n, 1, l, r);
      for (int j = 0; j <= 61; j++)
        if (y & (1ll << j)) x = 1ll * x * c[j] % p;
      printf("%d\n", x);
    }
  }
  return 0;
}
