#include <bits/stdc++.h>
const int MAX_N = 4e5 + 5;
const int MOD = 1e9 + 7;
const int COUNT = 62;
const int PRIMES[COUNT] = {
    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};
int n, q, arr[MAX_N];
long long inv[COUNT];
long long powmod(long long base, int exp) {
  long long res = 1;
  while (exp) {
    if (exp & 1) (res *= base) %= MOD;
    (base *= base) %= MOD;
    exp >>= 1;
  }
  return res;
}
struct node {
  int lo, hi;
  long long product, lazy_product;
  std::bitset<COUNT> bitset, lazy_bitset;
  node *lp, *rp;
  node(int _lo, int _hi) {
    lo = _lo;
    hi = _hi;
    lazy_product = 1;
    if (lo + 1 != hi) {
      lp = new node(lo, lo + hi >> 1);
      bitset |= lp->bitset;
      rp = new node(lo + hi >> 1, hi);
      bitset |= rp->bitset;
      product = lp->product * rp->product % MOD;
    } else {
      product = arr[lo];
      for (int i = 0; i < COUNT; ++i)
        if (product % PRIMES[i] == 0) bitset.set(i);
    }
  }
  void down() {
    if (lazy_product != 1 && lo + 1 != hi) {
      lp->update(lo, hi, lazy_product, lazy_bitset);
      rp->update(lo, hi, lazy_product, lazy_bitset);
      lazy_product = 1;
      lazy_bitset.reset();
    }
  }
  void update(int x, int y, long long v, const std::bitset<COUNT> &chk) {
    if (x >= hi || y <= lo)
      return;
    else if (x <= lo && y >= hi) {
      (product *= powmod(v, hi - lo)) %= MOD;
      (lazy_product *= v) %= MOD;
      bitset |= chk;
      lazy_bitset |= chk;
    } else {
      down();
      lp->update(x, y, v, chk);
      rp->update(x, y, v, chk);
      product = lp->product * rp->product % MOD;
      bitset = lp->bitset | rp->bitset;
    }
  }
  long long query(int x, int y, std::bitset<COUNT> &chk) {
    if (x >= hi || y <= lo)
      return 1;
    else if (x <= lo && y >= hi) {
      chk |= bitset;
      return product;
    } else {
      down();
      return lp->query(x, y, chk) * rp->query(x, y, chk) % MOD;
    }
  }
} * root;
int main() {
  for (int i = 0; i < COUNT; ++i) inv[i] = powmod(PRIMES[i], MOD - 2);
  scanf("%d%d", &n, &q);
  for (int i = 0; i < n; ++i) scanf("%d", &arr[i]);
  root = new node(0, n);
  while (q--) {
    char s[10];
    int l, r, x;
    scanf(" %s%d%d", s, &l, &r);
    if (s[0] == 'M') {
      scanf("%d", &x);
      std::bitset<COUNT> chk;
      for (int i = 0; i < COUNT; ++i)
        if (x % PRIMES[i] == 0) chk.set(i);
      root->update(l - 1, r, x, chk);
    } else {
      std::bitset<COUNT> chk;
      long long ans = root->query(l - 1, r, chk);
      for (int i = 0; i < COUNT; ++i)
        if (chk.test(i)) {
          ans = ans * (PRIMES[i] - 1) % MOD * inv[i] % MOD;
        }
      printf("%lld\n", ans);
    }
  }
  return 0;
}
