#include <bits/stdc++.h>
using namespace std;
const int N = 4e5 + 10;
const int M = 2e5 + 10;
const int mod = 1e9 + 7;
const int mod2 = 1e9 + 6;
int n, q, a[N];
int prime[] = {2,   3,   5,   7,   11,  13,  17,  19,  23,  29,  31,  37,  41,
               43,  47,  53,  59,  61,  67,  71,  73,  79,  83,  89,  97,  101,
               103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167,
               173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239,
               241, 251, 257, 263, 269, 271, 277, 281, 283, 293};
char s[15];
int l[M], r[M], x[M], ans[M];
long long b1[N], b2[N];
void update(int at, long long m, long long v) {
  while (at < n + 10) {
    b1[at] += m;
    b2[at] += v;
    at |= (at + 1);
  }
}
void update(int l, int r, long long v) {
  update(l, v, -v * (l - 1));
  update(r, -v, v * r);
}
long long query(int at) {
  long long m = 0, v = 0;
  int start = at;
  while (at >= 0) {
    m += b1[at];
    v += b2[at];
    at = (at & (at + 1)) - 1;
  }
  return (m * start + v);
}
inline int Pow(int a, long long p) {
  int ret = 1;
  while (p) {
    if (p & 1) ret = (long long)ret * a % mod;
    a = (long long)a * a % mod;
    p >>= 1;
  }
  return ret;
}
int main() {
  scanf("%d %d", &n, &q);
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &a[i]);
  }
  for (int i = 1; i <= q; ++i) {
    scanf(" %s %d %d", s, &l[i], &r[i]);
    if (s[0] == 'T') {
      x[i] = -1;
    } else {
      scanf("%d", &x[i]);
    }
    ans[i] = 1;
  }
  auto get = [](int &n, int p) {
    int cnt = 0;
    while (n % p == 0) n /= p, ++cnt;
    return cnt;
  };
  for (int pid = 0; pid < 62; ++pid) {
    int p = prime[pid];
    int inverse = Pow(p, mod - 2);
    memset(b1, 0, sizeof b1);
    memset(b2, 0, sizeof b2);
    for (int i = 1; i <= n; ++i) {
      update(i, i, get(a[i], p));
    }
    for (int i = 1; i <= q; ++i) {
      if (x[i] == -1) {
        long long cnt = query(r[i]) - query(l[i] - 1);
        if (cnt) {
          ans[i] = (long long)ans[i] * Pow(p, cnt) % mod;
          ans[i] = (long long)ans[i] * (1 - inverse + mod) % mod;
        }
      } else {
        int c = get(x[i], p);
        update(l[i], r[i], c);
      }
    }
  }
  for (int i = 1; i <= q; ++i)
    if (x[i] == -1) printf("%d\n", ans[i]);
}
